[__NSArrayM objectAtIndex:]:超出边界 [0 . 0] 的索引 2 和填充 UITableVi



我有两个部分,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中获取数据后给出其delegatedatasource。当你给它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方法。在您的情况下,您只需要在创建和添加对象后更改创建它的位置。此外,您还应该指定其delegatedatasource

所以你的解决方案应该是,

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

它工作正常.....

最新更新