题
在过去的几周中,我终于从常规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)行代码中表现出来。您知道“:”符号用于将参数传递给方法,而不是终止行?从本质上讲,您是雏菊将最后4行的链接在一起,这是没有道理的。至于特定的警告,getStringzfromtxtz是您在AwesomeBoxList上定义的一种方法,而不是NSCombobox的方法。 numberOfitemSincombobox:和Combobox:ObjectValueForiteMatIndex: NSCOMBOBOXDATASOURCE协议 方法是由您的课程代表NSCombobox而不是NSCombobox方法实施的方法。我建议对代表和协议进行一些阅读。
要详细说明:为了让您的AwesomeBoxList类使用NSCombobox,它需要向组合框需要知道的组合框提供信息。在苹果宇宙中,这样的情况通常与 委托设计模式. 。具体而言,组合盒需要知道 将显示多少个项目 也 每个显示的项目的对象表示. 。组合框声明了在此操作的界面 NSCOMBOBOXDATASOURCE协议. 。通过提供此信息,您可以充当组合框的数据源。您可以告诉组合框,它应该通过将自己设置为接口构建器中的数据源属性或打电话给您的数据,以获取其数据的数据。
[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;
}
提供有意义的实现就是您需要做的全部工作,以用数据填充组合框。我不知道您在这里想要的细节,但这就是您要遵循的模式。希望这对更多有所帮助。
其他提示
好吧,getTringzfromtxtz无法发送到NSCombobox实例,因为该方法在您的AwesomeBoxList类中声明和定义。此方法将在运行时找到。
另外,我认为您可能需要围绕代表和数据源来探讨 - 其他方法是NSComboboxDataSource协议的一部分。查看文档中的“组合框编程指南”以获取示例。
这些方法不存在。 有关更多信息,请参见NSCombobox文档。
代替:
[ComboBoz comboBox:(NSComboBox *)ComboBoz objectValueForItemAtIndex:[ComboBoz numberOfItemsInComboBox:(NSComboBox *)ComboBoz]];
尝试:
[[comboBox objectValues] objectAtIndex:[comboBox numberOfItems] - 1];
另外,请注意,平台约定是在ivar的开头使用下案字母。