我有两个部分,A-M和N-Z。
我注意到,如果我在每个部分都有相同数量的城市,就不会有问题。但是,如果我没有相同数量的城市,程序将崩溃。
错误是
-[__NSArrayM 对象索引:]: 索引 2 超出边界 [0 .. 0]'
这是错误生成时我的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"Region";
self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
AM = [[NSMutableArray alloc] init];
NZ = [[NSMutableArray alloc] init];
[AM addObject: @"Bologna"];
[AM addObject: @"Florence"];
[AM addObject: @"Milan"];
[NZ addObject: @"Naples"];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
switch (section) {
case 0:
return [AM count];
break;
case 1:
return [NZ count];
break;
default:
return section;
break;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Configure the cell...
NSInteger section = [indexPath section];
switch (section) {
case 0:
[cell.textLabel setText: [AM objectAtIndex: [indexPath row]]];
break;
case 1:
[cell.textLabel setText: [NZ objectAtIndex: [indexPath row]]];
break;
default:
break;
}
return cell;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
switch (section) {
case 0:
return @"A-M";
break;
case 1:
return @"N-Z";
break;
default:
break;
}
return nil;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString * AMPath = self.luzonRegion [indexPath.row];
NSString * NZPath = self.visayasRegion [indexPath.row];
switch (indexPath.section) {
case 0:
cityController.title = luzonRegionPath;
NSLog(@"Selected city: %@", AMPath);
break;
case 1:
cityController.title = visayasRegionPath;
NSLog(@"Selected city: %@", NZPath);
break;
default:
break;
}
[[self navigationController] pushViewController:cityController animated:YES];
}
如果直接在 XIB 中添加了UITableView
,则有两种方法可以使用数组中的数据填充它。您应该绑定其delegate
,并在IB
或程序中直接datasource
,何时需要。
如果您不确定何时可以显示数据,则可以在NSArray
中获取数据后给出其delegate
和datasource
。当你给它datasource
self
它会调用它的datasource
方法时,这些方法可能是,
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
两者都是datasource
方法所必需的,以填充UITableView
中的数据。
您的问题的唯一区别是您自己创建表。因此,在self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
行执行后,它将调用其datasource
方法。在您的情况下,您只需要在创建和添加对象后更改创建它的位置。此外,您还应该指定其delegate
和datasource
。
所以你的解决方案应该是,
- (void)viewDidLoad
{
//After creating AM & NZ arrays with objects
self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
[self.tableView setDelegate:self];
[self.tableView setDatasource:self];
}
你这样尝试,
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"Region";
tableView = [[[UITableView alloc] initWithFrame:CGRectMake(0,0,320,480) style:UITableViewStyleGrouped] autorelease];
tableView.delegate=self;
tableView.dataSource=self;
[self.view addSubview:tableView];
AM = [[NSMutableArray alloc] init];
NZ = [[NSMutableArray alloc] init];
[AM addObject: @"Bologna"];
[AM addObject: @"Florence"];
[AM addObject: @"Milan"];
[NZ addObject: @"Naples"];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
switch (section) {
case 0:
return [AM count];
break;
case 1:
return [NZ count];
break;
default:
return section;
break;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Configure the cell...
NSInteger section = [indexPath section];
switch (section) {
case 0:
[cell.textLabel setText: [AM objectAtIndex: [indexPath row]]];
break;
case 1:
[cell.textLabel setText: [NZ objectAtIndex: [indexPath row]]];
break;
default:
break;
}
return cell;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
switch (section) {
case 0:
return @"A-M";
break;
case 1:
return @"N-Z";
break;
default:
break;
}
return nil;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// NSString * AMPath = self.luzonRegion [indexPath.row];
// NSString * NZPath = self.visayasRegion [indexPath.row];
switch (indexPath.section) {
case 0:
//cityController.title = luzonRegionPath;
NSLog(@"Selected city: %@", [AM objectAtIndex: [indexPath row]]);
break;
case 1:
//cityController.title = visayasRegionPath;
NSLog(@"Selected city: %@",[NZ objectAtIndex: [indexPath row]]);
break;
default:
break;
}
// [[self navigationController] pushViewController:cityController animated:YES];
}
它工作正常.....