0

我在以下行遇到错误:

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;

米:

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

5 回答 5

4

问题是您在 UITableView 中使用静态单元格。只需增加情节提要中的行数。这是您可以通过编程方式添加到表视图的最大单元格数。

抱歉,我没有看到您没有使用情节提要。但我的回答对于使用它的人来说是正确的。

于 2013-09-11T19:51:23.007 回答
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;
}

这样你的设置对象总是被初始化。

于 2013-09-11T19:46:55.453 回答
1

如果您使用故事板和静态表,那么以下两件事之一可以工作:

1>返回行数的故事板中的单元格数应该相同。

或者

2>如果你想在故事板中保留一个单元格,那么实现 indentationLevelForRowAtIndexPath 数据源方法。如果你跟踪堆栈,那么你会发现各种数据源方法需要实现,因为在动态原型表中它会照顾它self 但在静态中我们需要实现数据源方法

于 2016-06-30T08:16:49.543 回答
-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;

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

于 2013-09-11T19:44:50.190 回答
-1

只需将其更改为:

cell1.textLabel.text = [settings objectAtIndex:indexPath.row-1];
于 2013-09-11T20:57:07.147 回答