当前位置:  开发笔记 > IOS > 正文

是否可以在Interface Builder中设计NSCell子类?

如何解决《是否可以在InterfaceBuilder中设计NSCell子类?》经验,为你挑选了4个好方法。

我正在尝试将NSCell子类化为在NSTableView中使用.我想要创建的单元格相当复杂,因此如果我可以在Interface Builder中设计它然后从笔尖加载NSCell,它将非常有用.

这可能吗?我该怎么做?



1> Ken..:

问题是关于NSCell的子类; 其他答案似乎正在做其他事情,可能利用UITableViewCell作为一个视图.

NSCell不是一个观点.虽然在IB中放置一个自定义单元格将是一件有用的事情,但我认为答案基本上是"不,这是不可能的".当你继承NSCell时,你几乎只是在做自己的绘图.没有支持子单元,或参数化自动布局(ala NSView的弹簧和支柱),我怀疑你在寻找什么.

唯一需要注意的是,你可以设计一个NSCell子类,它确实做了子元素的布局,并提供了用于设置这些子元素和所有可调整参数的参数.然后,您需要编写一个IB插件,以便在设计时在IB中提供该单元格和随附的检查员.

然而,这可能比编写一个或多或少做同样事情的小型自定义应用程序更难.将NSCell放在窗口中间的控件中,并自行设置用于调整您感兴趣的参数的UI.绑定可以使定位内容非常简单(即将x值绑定到滑块),尽管你会当然不能直接操纵元素.完成后,您可以归档您的单元格并在运行时在真实应用程序中加载存档,或者您只需注销属性并在应用程序的代码中设置它们.



2> 小智..:

这个帖子中的一些答案已经脱离主题,因为他们谈论的是Cocoa Touch,当最初的问题是关于Cocoa时 - 这两个API在这方面有很大不同,Cocoa Touch使它变得简单,因为UITableViewCell是一个视图子类.NSCell不是,这就是问题所在

有关信息,我最近必须在NSOutlineView中做一些非常相似的事情 - 这基本上是相同的,但是如果有的话会更难,因为你必须处理级别的泄露/崩溃.如果你对这些代码感兴趣,我在这里发布了它:http://www.stevestreeting.com/2010/08/08/cocoa-tip-using-custom-table-outline-cells-designed-in-ib /

HTH



3> Wil Shipley..:

正如肯所说,NSCells并且NSViews是不同的,你只能NSView在NIB中布局层次结构,而不是NSCells(没有任何明确的层次结构).

另一方面,没有任何东西阻止你有一个层次结构NSViews并使用它来绘制你的NSCell- 你可以将它们添加为你的单元格的父视图的子视图,告诉他们显示,并从窗口中删除它们没有人会更聪明.

在这种情况下,使用NIB会起作用,尽管看起来有点麻烦.通常我只是用NSCells自定义的对象替换了对象NSViews,但这意味着编写自己的鼠标处理代码,这非常敏感.

另一方面,我的方法允许您在NIB中绑定视图的值,因此您不必执行任何额外的工作,这很酷.



4> Kendall Helm..:

在IB中,启动一个空的XIB.现在转到托盘并在UITableViewCell中拖动,双击以显示和编辑.

仅包含自定义UITableViewCell(没有其他UIViews或其他顶级控件) - 确保它是IB中真正的UITableViewCell,或者您不能设置重用标识符(而不是在IB中将UIView作为自定义UITableViewCell类).然后,您可以在单元格中添加标签或任何您喜欢的内容,以及设置重用标识符或设置您可能喜欢的任何披露指示器.

要使用,您可以在tableView:cellForRow:atIndexPath:方法中提供如下代码:

YourCustomCellClass *cell = (YourCustomCellClass *)[tableView dequeueReusableCellWithIdentifier:];
if ( cell == nil )
{
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed: owner:self options:nil];
    id firstObject = [topLevelObjects objectAtIndex:0];
    if ( [ firstObject isKindOfClass:[UITableViewCell class]] )
        cell = firstObject; 
    else cell = [topLevelObjects objectAtIndex:1];
}

如果您要在代码中引用任何标签或其他控件,请将它们在IB中连接到您的自定义单元类 - 而不是文件的所有者,您不需要使用上面的代码设置它(您可以将其保留为NSObject ).

编辑:我注意到你真的在寻找一个NSCell的答案,但使用IB的代码方法在Cocoa中应该与我上面使用的Cocoa Touch代码相同,因为loadNibNamed是一个标准的Cocoa调用.


你这里有错误的操作系统.这不是Cocoa Touch.
推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有