1

我想动态添加行。我有建筑物名称的表格视图列表。如果有人选择建筑物(didSelectRowAtIndexPath),那么建筑物的各个楼层应作为子行动态添加。就像在各自的建筑列表选择中最大化和最小化子行一样。我该怎么做呢。提前致谢...

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// There is only one section.
if (tableView == indoortable || tableView == indoortable_iPad)
{
    return 1;
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section    {
// Return the number of time zone names.
if (tableView == indoortable || tableView == indoortable_iPad)
{
    return [indoorZones count];

}

}

cellForRowAtIndexPath 方法:

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

if (tableView == indoortable || tableView == indoortable_iPad)
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView  dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc]  initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

        cell.selectionStyle = UITableViewCellSelectionStyleGray;             //cell bg
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }       
    // Set up the cell.
    //cell.textLabel.text = [copyListOfItems objectAtIndex:indexPath.row];

    cell.textLabel.text =[indoorZones objectAtIndex: indexPath.row];
    //[cell setIndentationLevel:[[self.indoorZones objectAtIndex:indexPath.row] intValue]];
    return cell;
}
}

didSlectRowAtIndexPath 方法:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath   *)indexPath 
 {
zonesFloor = [[NSMutableArray alloc]init];
zonesFloorA = [[NSArray alloc] initWithObjects:@"Gr fl",@"1st fl",@"2nd fl",nil];

[zonesFloor addObject:zonesFloorA]; 
if (tableView == indoortable )
{

    NSUInteger i=indexPath.row+1;
    for (NSArray *count in self.indoorZones)  //app is crashing here giving  error.......Collection <__NSArrayM: 0x4b1d550> was mutated while being enumerated.
 {

        [zonesFloor addObject:[NSIndexPath indexPathForRow:i inSection:0]];
        [self.indoorZones insertObject:zonesFloor atIndex:i++];


    }

    [[self indoortable] beginUpdates];
    [[self indoortable] insertRowsAtIndexPaths:(NSArray *)zonesFloor  withRowAnimation:UITableViewRowAnimationNone];
    [[self indoortable] endUpdates];

    }


if (tableView == indoortable_iPad )
{

    //some logic
}

[tableView deselectRowAtIndexPath:selectedIndexPath animated:NO];
}

它给出以下错误 [__NSArrayI compare:]: Or [NSIndexPath _fastCStringContents:]: unrecognized selector sent to instance。我尝试了很多方法,但可能是我缺少某个地方。请建议。提前致谢。

4

2 回答 2

0

好吧,这听起来并不刻薄,但这里几乎有太多问题无法计算。

让我们从 tableView 的工作原理的基本解释开始,以便您可以开始解决这个问题:

首先,tableView 通过调用来询问表格中有多少个部分:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

}

在您的代码中,您只需告诉它它有一个部分。但是,在您以后的代码中,当您尝试向表中添加行时,您告诉它您要将行添加到第二个部分(索引为 1)。因此,您要么需要将这些行添加到第 0 部分,要么更新上述方法以告诉它,有时有两个部分。

其次,tableView 通过调用来询问表格的每个部分中有多少行:

- (NSInteger)tableView:(UITableView *)tableView 
             numberOfRowsInSection:(NSInteger)section {

}

在您的代码中,您只是返回区域的数量。但是,像上面一样,您需要包含已添加到表中的行。如果要将它们添加到不同的部分,则需要返回不同的值,具体取决于该部分中有多少行以及section变量中要求的索引。如果它们都在同一个部分,那么您需要将它们相加并返回正确的值。

第三,tableView 通过调用为该行请求一个实际的单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView 
                     cellForRowAtIndexPath:(NSIndexPath *)indexPath {

}

在您的代码中,您只返回一个单元格,该单元格的数据由indoorZones 数组填充,但您还需要提供为特定区域/楼层正确配置的单元格。同样,您需要根据需要通过节号或行号来确定这一点。

最后,当你点击一行时,tableview 会通过调用以下方法告诉你:

- (void)tableView:(UITableView *)tableView 
        didSelectRowAtIndexPath:(NSIndexPath   *)indexPath {

}

在此方法中,需要更新先前函数使用的数据源,以便在再次调用它们时,它们将提供正确的数据。您的数据源必须反映您希望表格视图的外观。在您的情况下,您有一个名为indoorZones 的数组。如果您只想显示一个区域列表,这很好,这就是您开始做的事情。但是,当您想添加更多行时,您需要先将更多行添加到您的数据源,这样当 tableView 重新开始这个过程时,它就已经存在了。

如果您希望所有内容都保留在一个部分中,那么我会提出一个可以包含两种类型的行的数据源,并且能够区分它们,以便cellForRowAtIndexPath可以创建正确类型的单元格并返回它。

如果您想要两个部分,那么我将为第二部分添加第二个数组(因为它不是同一类型的数据)并根据您需要用于该部分的数组在每个方法中返回适当的值.

我希望这有帮助!

于 2012-07-11T17:26:35.923 回答
0
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath   *)indexPath 
{
    //NSIndexPath *selectedIndexPath = [self.indoortable indexPathForSelectedRow];
zonesFloorA = [[NSArray alloc] initWithObjects:@"Gr fl",@"1st fl",@"2nd fl",nil];

if (tableView == indoortable )
{
    for (NSString *str in zonesFloorA) {
        [indoorZones addObject:str];
   }
   //[[self indoortable] beginUpdates];
   //[[self indoortable] insertRowsAtIndexPaths:(NSArray *)zonesFloor  withRowAnimation:UITableViewRowAnimationNone];
   //[[self indoortable] endUpdates];
}
if (tableView == indoortable_iPad )
{

//some logic
 }

  [tableView reloadData];

}

这可以满足你的要求吗

于 2012-06-28T14:22:43.687 回答