0

在过去的几周里,我终于从常规 C 进入 Obj-C 并开始了我的第一个应用程序。我看过教程并阅读了一本书以及很多网页,但我知道我才刚刚开始。无论如何,在大半夜和今天早上,我一直在努力让这段代码工作,现在它可以编译了,我有一些警告。我已经搜索并发现了类似的解决方案问题,但仍然没有骰子。我要做的是将一个由 txt 文档制成的数组放入组合框中的弹出列表中。

AwesomeBoxList.h:

    #import <Cocoa/Cocoa.h>
@interface AwesomeBoxList : NSObject 
{
  IBOutlet NSComboBox *ComboBoz;
}
-(NSArray *) getStringzFromTxtz;
- (void) awesomeBoxList;
@end

AwesomeBoxList.m:

#import "AwesomeBoxList.h"

@implementation AwesomeBoxList

-(NSArray *)getStringzFromTxtz 
{
...
return combind;
}

- (void) awesomeBoxList
{
 [ComboBoz setUsesDataSource:YES];


 [ComboBoz setDataSource:

[ComboBoz getStringzFromTxtz]: //'NSComboBox' may not respond to 'getStringzFromTxtz'

[ComboBoz comboBox:(NSComboBox *)ComboBoz objectValueForItemAtIndex: 

 [ComboBoz numberOfItemsInComboBox:(NSComboBox *)ComboBoz]]];


        /*'NSComboBox' may not respond to '-numberOfItemsInComboBox:'
   'NSComboBox' may not respond to '-comboBox:objectValueForItemAtIndex:'
   'NSComboBox' may not respond to '-setDataSource:'
  */
 }

@end

因此,由于所有这些错误以及我对 Obj-C 的了解仍然很浅,我一定犯了某种 n00b 错误。

谢谢您的帮助。

4

3 回答 3

1

这里似乎确实存在大量混淆,主要体现在您的最后 (4) 行代码中。您知道“:”符号用于将参数传递给方法,而不是终止行吗?您实际上是以一种毫无意义的方式将最后 4 行链接在一起。至于具体的警告,getStringzFromTxtz 是你在 AwesomeBoxList 上定义的方法,不是 NSComboBox 的方法。numberOfItemsInComboBox: 和 comboBox:objectValueForItemAtIndex: 是NSComboBoxDataSource 协议方法,旨在由您的类代表 NSComboBox 实现,而不是 NSComboBox 方法。我建议阅读一下代表和协议。

详细说明:为了让 AwesomeBoxList 类使用 NSComboBox,它需要向组合框提供组合框需要知道的信息。在 Apple Universe 中,此类情况通常使用委托设计模式来处理。具体来说,组合框需要知道它将显示多少项目以及每个显示项目的对象表示。组合框在NSComboBoxDataSource 协议中声明了执行此操作的接口。通过提供此信息,您将充当组合框的数据源。您可以通过在 Interface Builder 中将自己设置为它的 dataSource 属性或调用

[ComboBoz setDataSource:self];

从 AwesomeBoxList 的实现中的某个地方。这将确保组合框调用您的类中的方法来填充自己的信息。您的 AwesomeBoxList 类应该专门实现两种方法,它们将由组合框调用:

- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index {
    switch (index) {
        // Return some object that is represented by index in the combo box
    }
}

- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox {
    // return theNumberOfItemsInYourComboBox;
}

提供一个有意义的实现是您用数据填充组合框所需要做的一切。我不知道你想要什么的细节,但这就是你想要遵循的模式。希望对您有所帮助。

于 2011-01-11T16:56:07.397 回答
0

好吧, getStringzFromTxtz 将无法发送到 NSComboBox 实例,因为该方法已在 AwesomeBoxList 类中声明和定义。在运行时将找不到此方法。

另外,我认为您可能需要了解委托和数据源 - 其他方法是 NSComboBoxDataSource 协议的一部分。查看文档中的 Combo Box Programming Guide 以获取示例。

于 2011-01-11T16:45:41.267 回答
0

这些方法不存在。 有关详细信息,请参阅 NSComboBox 文档。

代替:

[ComboBoz
 组合框:(NSComboBox *)ComboBoz
 objectValueForItemAtIndex:[ComboBoz numberOfItemsInComboBox:(NSComboBox *)ComboBoz]];

尝试:

[[comboBox objectValues] objectAtIndex:[comboBox numberOfItems] - 1];

另外,请注意平台约定是在 ivar 的开头使用小写字母。

于 2011-01-11T16:58:38.280 回答