Cocoa 用户界面加载问题
Posted
技术标签:
【中文标题】Cocoa 用户界面加载问题【英文标题】:Cocoa user interface loading problems 【发布时间】:2014-03-22 06:28:34 【问题描述】:我是目标 C 的菜鸟,所以如果我没有使用正确的术语来描述我的问题,我很抱歉,但我需要帮助,所以是我最少的资源!
我正在尝试将 Arduino 天平与我的 mac 与目标 C 软件连接,其中我有一个 Nib 文件和一个控制器:为此,我使用运行正常的 ORSSerialPort。
在加载用户界面后,我在加载 NSCombobox(使用户能够选择串行端口的那个)时遇到了一些问题:在我的控制器类中,我有一个名为“InitializeView”的方法,它调用此方法:
-(void)RefreshSerialPortsInComboBox
//Clear all existing elements
for (int i = 0; i < [self.serialPortsComboBox numberOfItems]; i++)
[self.serialPortsComboBox removeItemAtIndex:i];
//Reload the serial ports list
NSArray *availableSerialPorts = [[NSArray alloc] initWithArray:[serialPortManager availablePorts]];
//Reload the Combobox elements with the new serial ports list
for (int i = 0; i < [availableSerialPorts count]; i++)
[self.serialPortsComboBox addItemWithObjectValue:[[availableSerialPorts objectAtIndex:i] valueForKey:@"_path"]];
[self InsertTextInBufferTextView:@"Elemento creato...\n"];
问题是,如果我在控制器对象的 init 方法中调用此方法,这将不起作用,并且组合框项列表仍然为空:请注意控制器是由 Interface Builder 实例化的。
我尝试将上述方法链接到一个按钮并且它可以工作,所以这似乎是加载优先级的问题,似乎我要在加载 ui 对象或使其准备好工作之前调用该方法on...或者可能是别的什么,但我不知道是什么。
有人可以帮我吗?
【问题讨论】:
【参考方案1】:为了完整起见,另一个类似的替代方法是实现方法 awakeFromNib,该方法会为 nib 文件中表示的所有对象调用。它在非正式协议 NSNibAwaking 中定义
【讨论】:
【参考方案2】:你应该在 loadView 方法中调用这个方法:
- (void)loadView
[super loadView];
[self RefreshSerialPortsInComboBox];
您的代码不起作用,因为视图和所有 IBOutlets 尚未在“init”方法中初始化。
【讨论】:
谢谢。也许我在设置控制器时出错了,因为调试器说:“'NSObject' 没有可见的@interface 声明选择器'loadView'”。我的控制器是一个简单的 ObjC 类,它继承自 NSObject,由 IB 实例化。也许我应该使用“视图控制器”? 您需要使用 NSViewController 作为视图控制器的超类 我做到了,现在在我的实现文件中我有两个方法,第一个是(id)init,第二个是(void)loadView。我已经在第一个中调用了第二个,但它开始了一个循环,我是否必须合并这两个方法?怎么做?原谅我,我来自 VB.net,我很喜欢 objC 但它很难。 不要手动调用loadView,viewController会自动调用。以上是关于Cocoa 用户界面加载问题的主要内容,如果未能解决你的问题,请参考以下文章
Cocoa 界面元素,用于添加/删除 Mail.app 中的规则编辑器等字段