在过去的几周里,我终于从常规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的了解仍然很浅,我必须犯某种错误。
感谢您的帮助。
答案 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的开头使用小写字母。