2

定義済みの nsarray から 50 行が取り込まれた uitableview があります。

一度に許可される最大3つの行で複数の行を選択し、選択時にチェックを表示し、選択解除時にチェックを削除するにはどうすればよいですか/

私は本当に xcode に慣れていないので、助けていただければ幸いです。ありがとうございました。

4

2 に答える 2

3

データは、選択されているかどうかを追跡する必要があります。

2つの一般的な方法は次のとおりです。事前定義された配列の各オブジェクトに、選択されているかどうかを示すBOOLがあるか、選択されたオブジェクトへの参照のみを保持する2番目の配列を保持します。選択できるのは3つに制限されているため、2番目のオプションの方が適している場合があります。

誰かがテーブル内のセルを選択すると、関連するオブジェクトの選択ステータスを変更し、そのBOOLを切り替えるか、追加の配列でセルを追加/削除します。これは、許可されている数の選択肢がすでにあるかどうかを確認する場所でもあります。選択が変更された場合は、データをリロードするようにテーブルに指示します。

cellForRowAtIndexPath:オブジェクトが選択されているかどうかを確認し、それに応じてマークを付けます。

于 2012-07-30T15:47:50.297 に答える
3
int counter = 0; //keep track of how many rows are selected
int maxNum = 3; //Most cells allowed to be selected

//Called when the user selects a row
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    //If the cell isn't checked and there aren't the maximum allowed selected yet
    if (cell.accessoryType != UITableViewCellAccessoryCheckmark && counter < maxNum)
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        counter++;
    }
    else if (counter >= maxNum) return; //Don't do anything if the cell isn't checked and the maximum has been reached
    else //If cell is checked and gets selected again, deselect it
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
        counter--;
    }
}

また、セル内のデータを使用して何かを実行したい場合に備えて、選択されたセルのインデックスの配列を保持することもできます。これを行う方法がわからない場合は、お知らせください。コードを追加します。

ノート:

  • このメソッドを正しく呼び出すには、テーブルビューデリゲートプロトコルを実装する必要があります。
  • これは「最善の」方法ではありませんが(セルのコンテンツを使用して選択を追跡することは一般的に眉をひそめます)、非常に簡単です。
  • セルの再利用で問題が発生する可能性があります。これを修正したい場合は、セルのインデックスを保存し、アクセサリの種類をに設定します。cellForRowAtIndexPath
于 2012-07-30T15:48:30.623 に答える