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 中进行全局事件监控?

Cocoa 应用程序界面随机“断开”程序代码

Cocoa 界面元素,用于添加/删除 Mail.app 中的规则编辑器等字段

如何允许用户将文件拖出 Cocoa 应用程序

防止用户在从远程 ftp 服务器 cocoa 流式传输文件时重命名文件

带有命令行界面的 Core Data Cocoa 应用程序