UITableView 索引超出边界错误



我在以下行遇到错误:

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];

最新更新