0

私のアプリケーションでは、を使用していUITableviewます。そのTableViewで、辞書を含む配列を表示しています。TableViewの最後の行には、ユーザーがさらにイベントをロードすることを示す1つのボタンが含まれています。ユーザーがボタンをクリックした場合、サービスからデータを取得し、データをにロードする必要がありますUITableview

その目的のために、私は以下のコードのようにそれを実装しようとしています:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section**
{
    if (ifMore)
    {
        return [totalArray count];
    }
    else
    {
        return [tableArray count];
    }
    return 0;
}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    int count =[tableArray count];
    if (ifMore)
    {
        count= [totalArray count];
    }

    if (indexPath.row==count-1)
    { 
        return 96;
    } 

    return 56;
}

行インデックスメソッドのセルは次のとおりです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
     static NSString *CellIdentifier = @"Cell";

     TableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

     cell = [[TableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

     NSMutableDictionary *dict=[[NSMutableDictionary alloc]init];

     if (ifMore) 
     {               
         dict=[totalArray objectAtIndex:indexPath.row];   
     }
     else
     {
         dict =[tableArray objectAtIndex:indexPath.row];
     }

     cell.hostLabel.text=[dict objectForKey:@"Event_Name"];

     cell.startTime.text=[dict objectForKey:@"Event_Startdate"]; 

     cell.endTime.text=  [dict objectForKey:@"Event_Enddate"]; 

     cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;

     int count=[tableArray count];

     if(ifMore)
     {
         count=[totalArray count];
     }
     if (indexPath.row==count-1)
     {
         [cell.contentView addSubview:moreBtn];   
     }
     return cell;  
} 

私はこのようなコードを使用しています。今、私の主な問題は、データを通常ロードしているときに、スクロールをロードしているときに問題が発生しないことです。それは完璧に機能します。しかし、TableViewセルのボタンをクリックして、サービスからデータを取得し、データをリロードするとします。正常に動作します。しかし、スクロールしているとクラッシュします。私はこれで立ち往生しています。

クラッシュメッセージは次のとおりです。

2012-12-20 12:22:49.312 IAGDapp[3215:15e03] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 4 beyond bounds [0 .. 3]'
*** First throw call stack:
(0x4b5052 0x21c7d0a 0x4a1db8 0x2b9e6 0x2b7d2 0xc80a57 0xc80b92 0xc8669e 0x7402db 0x7401af 0x489966 0x489407 0x3ec7c0 0x3ebdb4 0x3ebccb 0x1f6b879 0x1f6b93e 0xc2ba9b 0x28e0 0x2105 0x1)
terminate called throwing an exceptionsharedlibrary apply-load-rules all
kill

エラーを見つけるのを手伝ってもらえますか?

4

4 に答える 4

1

これについてはパラスに同意します。データを配列にフェッチする部分はわかりませんが、データの適切なリロード/間違った配列からのデータの取得/ifMore変数の設定を省略すると、アプリがクラッシュします。まず、それらを確認する必要があります。何も問題がないと思われる場合は、内部にブレークポイントを設定し、numberOfRowsInSection4 つ以上のセルを配置したい場所で 4 が返される理由を確認してください。

ifMoreしかし、実際には、その目的のために2つの異なる配列と変数が必要だとは思いません。単一の配列を用意し、データをフェッチした後にそれを更新し、テーブルをリロードして、totalArray とifMore変数を含むすべての if ステートメントを削除します。シンプルさは安定性に役立ちます。

于 2012-12-20T08:09:28.923 に答える
1

ここでセルをクリックするUIButtonと、サービスから別のデータを取得し、このデータを同じテーブルにロードしたいので、この手順に従います..

  1. 最初にデータを取得したら、このデータを tableArray と totalArray にも追加します。

  2. その後、テーブルをリロードします。

ここで numberOfRows と他のメソッドがこの新しい更新された配列を見つけられないため、クラッシュします。

于 2012-12-20T07:24:43.023 に答える
0

ifMore変数が期待どおりに機能していないようです。エラーログは 範囲を超えたインデックス4[0.. 3]であったため、テーブルビューのデータソースには3つの要素しか含まれていませんが、numberOfRowsInSectionで返されたカウントは4でした。

別の解決策として、 [その他]ボタンを常にデータソースの最後の行にしたい場合は、単一の配列を使用してそれを実行できないのはなぜですか。メソッドtableArray.count + 1で(詳細ボタン)を返すだけです。numberOfRowsInSectioncellForRowAtIndexPath、インデックスが上にあるかどうかを確認してからtableArray.count、ボタンを作成します。heightForRowAtIndex方法も同じです。

于 2012-12-20T07:40:41.970 に答える
0

問題はあなたのループです。

if (indexPath.row==count-1) 
{

return 96;

}

配列の数は 4 で、テーブルビューに 96 行をロードしようとしています。したがって、アプリケーションがクラッシュしています。

問題はUITableViewをスクロールしていません。問題は、配列をテーブルにロードすることです。

于 2012-12-20T07:15:59.307 に答える