“'对象'可能无法响应'功能'”警告

时间:2011-01-11 16:32:32

标签: objective-c nscombobox

在过去的几周里,我终于从常规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的了解仍然很浅,我必须犯某种错误。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

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

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

来告诉组合框它应该将您的数据推迟到您的类中。
[ComboBoz setDataSource:self];

来自AwesomeBoxList实现中的某个地方。这将确保组合框调用类中的方法以使用info填充自身。您的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;
}

使用数据填充组合框只需提供有意义的实现即可。我不知道你想要的具体细节,但这就是你想要遵循的模式。希望有所帮助。

答案 1 :(得分:0)

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

此外,我认为您可能需要了解代理和数据源 - 其他方法是NSComboBoxDataSource协议的一部分。查看文档中的组合框编程指南以获取示例。

答案 2 :(得分:0)

这些方法不存在。 See the NSComboBox documentation for more information.

而不是:

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

尝试:

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

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