我在以下行遇到错误:
cell1.textLabel.text = [settings objectAtIndex:indexPath.row];
这是我收到的未捕获的初始错误:
Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 2]' First throw call stack: (0x2265012 ... 0x21a5 0x1) libc++abi.dylib: terminate called throwing an exception (lldb)
这是我的代码:
.h:
@interface ViewController : UIViewController <UITableViewDataSource ,UITableViewDelegate>{
//Settings Table
IBOutlet UITableView *settingTable;
NSMutableArray *settings;
}
@property (nonatomic, retain) UITableView *settingTable;
@property (nonatomic, retain) NSMutableArray *settings;
.m:
@synthesize settingTable;
@synthesize settings;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (!settings) {
return 0;
}
if ([settings count] > 0){
return [settings count];
}
else
return 0;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (settingTable) {
NSLog(@"%@", settings);
UITableViewCell *cell1 = [settingTable dequeueReusableCellWithIdentifier:@"MainCell1"];
if (cell1 == nil) {
cell1 = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MainCell1"];
}
cell1.textLabel.text = [settings objectAtIndex:indexPath.row];
return cell1;
}
// ...
- (void)viewDidLoad
{
[super viewDidLoad];
settingTable.delegate = self;
settingTable.dataSource = self;
//settings table
settings = [[NSMutableArray alloc] initWithObjects:@"Downloads", @"Queue", @"FAQ", nil];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
问题是您在UITableView中使用静态单元格。只需增加情节提要中的行数即可。它是可以通过编程方式添加到表视图的最大单元格计数。
抱歉,我没有看到您没有使用故事板。但是对于那些使用它的人来说,我的答案是正确的。
我会将您的设置更改为像这样初始化:
- (void)viewDidLoad
{
[super viewDidLoad];
settingTable.delegate = self;
settingTable.dataSource = self;
}
- (NSMutableArray *)settings
{
if (!_settings) settings = [[NSMutableArray alloc] initWithObjects:@"Downloads", @"Queue", @"FAQ", nil];
return _settings;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return settings.count;
}
这样,您的设置对象将始终处于初始化状态。
如果您使用的是故事板和静态表,那么以下两种方法之一就可以工作:
1> 返回行数的故事中的单元格数应相同。
或
2>如果要在故事板中保留一个单元格,则实现缩进水平为行索引路径数据源方法。在异常中,如果您跟踪堆栈,那么您会找到您需要实现的各种数据源方法,因为在动态原型表中它会自己处理,但在静态中我们需要实现数据源方法
要清理代码,您可以执行以下操作:
1.In cellForRowAtIndexPath 方法,请使用
if([settings count]>0)
而不是
if(settingTable)
2.In 行数方法,使用
if ([settings count] > 0){
return [settings count];
}
else
return 0;
而不是
if(!settings){
return 0;
}
if ([settings count] > 0){
return [settings count];
}
else
return 0;
代码中的上述更改将使您的代码完美运行。
只需将其行更改为:
cell1.textLabel.text = [settings objectAtIndex:indexPath.row-1];