【问题标题】:Using the same NIB with multiple View Controllers对多个视图控制器使用相同的 NIB
【发布时间】:2011-03-17 01:08:07
【问题描述】:
基本上,我想使用一个 nib 文件和视图控制器作为我计划多次创建的视图的模板。这个笔尖将有几个标签和自定义视图。
我的想法是,我将遍历一个对象数组,并为每个对象创建一个此控制器的实例,并为数组中的对象设置一个属性。
目前这一切都很好,除了一件事 - 当我调用 setStringValue 时标签不会更新:!!!
我正在使用视图控制器代码中的方法进行更改,但它不起作用,我猜测 IBOutlet 没有正确连接,这很奇怪,因为自定义视图正在连接完美。
有什么想法吗?
【问题讨论】:
标签:
objective-c
cocoa
nsview
iboutlet
nsviewcontroller
【解决方案1】:
在 awakeFromNib 上设置断点并在调试器中查看标签出口的值是什么。在调用 awakeFromNib 之前,所有插座都应该已连接。如果它仍然为零,那么你就有答案了。调用 setStringValue: on nil 完全是“无”。在这种情况下,您没有正确绑定插座,或者您曾经正确绑定过它,后来更改了名称,在这种情况下,Xcode4 或界面生成器中应该有一个黄色警告三角形,表明有问题;但是它不会阻止您的应用程序构建或运行,出口只会在对象创建后保持其初始值(即 nil)。
【解决方案2】:
当你分配你的 NSViewControllers 时,只需用 NIB 的名字初始化:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
【解决方案3】:
感谢您的回复,他们很有帮助,但并不完全符合我的意思。
我最终通过创建一个空的 NIB 并用自定义的 NSView 和一些其他控件填充它来解决它。我为这些控件创建了一个带有 IBOutlets 的 NSView 子类,并将自定义视图的标识设置为我在界面生成器中的子类。
每次我想绘制它的技巧是在我的子类中创建一个类方法,该方法将加载 nib 并以我想要的方式返回视图设置。
代码如下:
+(id)todoViewFromNibWithFrame:(NSRect)frameRect todoList:(TodoList *)aTodoList
{
NSNib *todoViewNib = [[NSNib alloc] initWithNibNamed:@"TodoView" bundle:nil];
NSArray *objects = nil;
id todoView = nil;
[todoViewNib instantiateNibWithOwner:nil topLevelObjects:&objects];
for (id object in objects) {
if ([object isKindOfClass:[self class]]) {
todoView = object;
[todoView setTodoList:aTodoList];
break;
}
}
[todoViewNib release];
return todoView;
}
再次感谢您的回复!
史蒂夫