调用方法
后阵列为空每当我调用另一个类中的方法-(void)setArrayCheckOut:(int)num
时,数组arrayCheckout
为空。在-(void)setArrayCheckOut:(int)num
之后调用-(IBAction)reloadTable:(id)sender
“导致重载表 - (null),0”。调用方法
任何想法出了什么问题?
这么久
@implementation CheckOut
-(id)init
{
[super init];
tableCheckOut = [[NSTableView alloc]init];
if (!arrayCheckOut)
{
arrayCheckOut = [[NSMutableArray alloc]init];
[arrayCheckOut addObject:@"-"];
}
return self;
}
-(void)setArrayCheckOut:(int)num
{
switch (num) {
case 170:
[arrayCheckOut addObject:@"T20, T20, DB"];
break;
default:
[arrayCheckOut addObject:@"-"];
break;
}
NSLog(@"array = %@",[arrayCheckOut objectAtIndex:0]);
[tableCheckOut reloadData];
}
-(IBAction)reloadTable:(id)sender
{
NSLog(@"reload table - %@, %d",[arrayCheckOut objectAtIndex:0],[arrayCheckOut count]);
[tableCheckOut reloadData];
}
- (int)numberOfRowsInTableView:(NSTableView *)tv
{
return [arrayCheckOut count];
}
- (id)tableView:(NSTableView *)tv
objectValueForTableColumn:(NSTableColumn *)tColumn
row:(int)row
{
NSString *v = [arrayCheckOut objectAtIndex:row];
return v;
}
@end
如果数组是空的,objectAtIndex:0
会抛出异常。
既然它没有,但是返回nil
,您没有数组:您已将objectAtIndex:
消息发送到nil
。
最有可能的是,CheckOut
不是那种其实例初始化为init
的类。检查其超类的文档以查看其指定的初始化程序是什么,然后改写它。
我是新手编程...我应该使用什么样的auf初始化器?超类是NSObject,所以我期望只有一个初始化器(init)。 – lueda 2010-10-03 08:30:11
您应该实现将调用的任何初始化器。 NSObject提供的唯一初始化函数是'init',所以这可能是你需要在你的子类中实现的初始化函数。因为你已经实现了它来创建数组,所以这会让我们回到为什么你没有数组的问题。你是否遗漏了一些将'arrayCheckOut'变量设置回'nil'的代码? – 2010-10-03 08:47:04
对我的项目的内容进行了精简。 arrayCheckOut仅在CheckOut.h/m中定义。所以这是我的整个项目,包括所有的源文件:http://stubbi.org/Darx.zip。你可以看到'arrayCheckOut'被正确设置,但是表格没有用新值刷新。 'arrayCheckOut'再次得到它的默认值。也许你发现错误 – lueda 2010-10-03 09:48:41
arrayCheckOut在哪里定义?显示代码。 – 2010-10-02 23:23:48
没有,因为我不需要它。该数组将只能被应用程序读取并完全删除,然后再填充它。 – lueda 2010-10-02 23:29:44
'setArrayCheckOut:'的问题包括一个幻数(170),魔术和非本地化的字符串文字,使用'int',其中'NSInteger'或'NSUInteger'可能更合适(在您的数据源方法中也是一个问题) ,以及该方法的非描述性名称。我建议为数字和字符串定义常量,使用'NSLocalizedString'定位字符串(因为它们似乎用于显示给用户),切换到'NSInteger'或'NSUInteger',并将'setArrayCheckOut:'重命名为更清楚地说明了方法的目标,而不仅仅是它的实现。 – 2010-10-02 23:48:58