我在以下行遇到错误:
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
{
}
答案 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];