1

行を動的に追加したい。建物名のテーブルビュー リストがあります。誰かが building(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;
}
}

didSelectRowAtIndexPath メソッド:

 - (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:]: または [NSIndexPath _fastCStringContents:]: 認識されないセレクターがインスタンスに送信されました。私は多くの方法を試しましたが、どこかが欠けているかもしれません。提案してください。前もって感謝します。

4

2 に答える 2

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 に答える
0

意地悪に聞こえるかもしれませんが、数え切れないほど多くの問題があります。

これを修正し始めることができるように、tableView の仕組みの基本的な説明から始めましょう。

まず、tableView は次のように呼び出して、テーブル内にいくつのセクションがあるかを尋ねます。

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

}

コードでは、セクションが 1 つであることを単純に伝えます。ただし、後のコードでは、テーブルに行を追加しようとすると、行を 2 番目のセクション (インデックス 1) に追加するように指示します。したがって、代わりにこれらの行をセクション 0 に追加するか、上記のメソッドを更新して、場合によっては 2 つのセクションがあることを伝える必要があります。

次に、tableView は次のように呼び出して、テーブルの各セクションにある行数を尋ねます。

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

}

コードでは、単にゾーンの数を返しています。ただし、上記のように、テーブルに追加した行を含める必要があります。それらを別のセクションに追加する場合は、section変数で要求されたインデックスを持つセクション内の行数に応じて、異なる値を返す必要があります。それらがすべて同じセクションにある場合は、それらを合計して正しい値を返す必要があります。

3 番目に、tableView は次のように呼び出して、行の実際のセルを要求します。

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

}

コードでは、indoorZones 配列によってデータが取り込まれたセルのみを返していますが、特定のゾーン/フロア用に適切に構成されたセルも提供する必要があります。繰り返しますが、必要に応じて、セクション番号または行番号でこれを決定する必要があります。

最後に、行をクリックすると、テーブルビューは次のメソッドを呼び出して通知します。

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

}

この方法では、以前の関数が再度呼び出されたときに正しいデータが提供されるように、以前の関数で使用されているデータ ソースを更新する必要がありますデータ ソースは、テーブル ビューの外観を反映する必要があります。あなたの場合、indoorZones という配列があります。これは、ゾーンのリストを表示したいだけの場合に適しています。これは、最初に行うことです。ただし、さらに行を追加する場合は、最初にデータ ソースに行を追加する必要があります。これにより、tableView がこのプロセスを最初からやり直したときに、既にそこにあるようになります。

すべてを 1 つのセクションに収めたい場合は、両方のタイプの行を含めることcellForRowAtIndexPathができ、適切なタイプのセルを作成して返すことができるようにそれらを区別できるデータ ソースを考え出します。

2 つのセクションが必要な場合は、2 番目のセクションに 2 番目の配列を追加し (同じタイプのデータではないため)、そのセクションに使用する必要がある配列に基づいて、これらの各メソッドで適切な値を返します。 .

これが役立つことを願っています!

于 2012-07-11T17:26:35.923 に答える