超出边界错误的UITableView索引

时间:2013-09-11 19:01:29

标签: ios objective-c

我在以下行遇到错误:

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
{
}

5 个答案:

答案 0 :(得分:4)

问题是你在UITableView中使用静态单元格。只需增加故事板中的行数即可。它是您可以以编程方式添加到Table View的最大单元格数。

抱歉,我没有看到你没有使用故事板。但我的回答对于那些使用它的人来说是正确的。

答案 1 :(得分:1)

我会将您的设置更改为如下所示进行初始化:

- (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;
}

这样,您的设置对象始终会初始化。

答案 2 :(得分:1)

如果您正在使用故事板和静态表,则可以使用以下两种方法之一:

1&GT;在返回行数的故事中,单元格的数量应该相同。

2 - ;如果你想在故事板中保留一个单元格然后实现indentationLevelForRowAtIndexPath数据源方法。如果你跟踪堆栈然后你会发现需要实现的各种数据源方法,因为在动态原型表中它会照顾它自己但是在static中我们需要实现数据源方法

答案 3 :(得分:-1)

要清理代码,您可以执行以下操作:

1.在cellForRowAtIndexPath方法中,使用

if([settings count]>0)

而不是

if(settingTable)

2.在numberOfRowsInSection方法中,使用

if ([settings count] > 0){
    return [settings count];    
}
else
    return 0;

而不是

if(!settings){
    return 0;
}
if ([settings count] > 0){
    return [settings count];

}
else
    return 0;

您的代码中的上述更改将使您的代码完美运行。

答案 4 :(得分:-1)

只需将其更改为:

cell1.textLabel.text = [settings objectAtIndex:indexPath.row-1];