web-dev-qa-db-ja.com

複数選択を許可するようにUITableViewを構成することは可能ですか?

IPhoneの場合、複数選択を許可するようにUITableViewを構成できますか?

各UITableViewCellの-setSelected:animated:をオーバーライドしようとしましたが、別のセルの選択によりUITableViewが選択を解除したと考えるものから実際の選択を解除するのが難しいため、必要な動作を変更しようとするのは難しいです!

誰かが助けてくれることを願っています!

ありがとう、

ニック。

41
Nick Cartwright

これを行う最良の方法は、選択した行ごとにチェックマークを付けることです。

選択するには、選択したUITableViewCellインスタンスのaccessoriesTypeをUITableViewCelAccessoryCheckmarkに設定します。

行を選択解除するには、UITableViewCellAccessoryNoneに戻します。

選択されたセル/行を列挙するには(ボタンをクリックしたときなど)、テーブルのセルを繰り返し処理してUITableViewCellAccessoryCheckmarkを探します。または、「did select」デリゲートメソッドでテーブルビューデリゲートのNSSetなどを管理します。

37
z8000

IOS5.0以降用のアプリを開発している場合、次のプロパティは正常に機能するはずです。

self.tableView.allowsMultipleSelection = YES;
39
Hamdi

次のコードを使用して、セルアクセサリタイプを設定します。

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

    UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];


    if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
        thisCell.accessoryType = UITableViewCellAccessoryCheckmark;

    }else{
        thisCell.accessoryType = UITableViewCellAccessoryNone;

    }
}

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath {

//add your own code to set the cell accesory type.
return UITableViewCellAccessoryNone;
}
25

Jeff Lamarcheには、これを行う方法に関するチュートリアルがここにあります。

http://iphonedevelopment.blogspot.com/2008/10/table-view-multi-row-edit-mode.html

私はコードを試したことはありませんが、しばらく必要な日が来ることを知って、しばらく気になりませんでした。

24
oldbeamer

allowsMultipleSelectionDuringEditingallowsMultipleSelectionをiOS5から古いiOSにバックポートしました。 https://github.com/ud7/UDTableView-allowsMultipleSelection でフォークできます

それはドロップイン置換であり、あなたがする必要があるのはUITableViewをUDTableViewに変更することだけです(コードまたはインターフェースビルダーで)

11
RolandasR

HIGから:

ユーザーがリストアイテムを選択すると、テーブルビューにフィードバックが表示されます。具体的には、アイテムを選択できる場合、ユーザーがアイテムを選択すると、アイテムが含まれている行が短時間強調表示され、選択が受信されたことを示します。その後、すぐにアクションが発生します。新しいビューが表示されるか、行にチェックマークが表示され、アイテムが選択されたことを示します。テーブルビューには永続的な選択状態が表示されないため、行が強調表示されたままになることはありません。

Mailのようなものを使用するか、セルでチェックマークアクセサリを使用して、独自の複数選択スタイルをロールする必要があります。

5
Ben Gottlieb

あなたが必要とする複数の選択のためのみんな

self.tableView.allowsMultipleSelection = YES;

viewDidLoadおよび

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
    tableViewCell.accessoryView.hidden = NO; 
    // if you don't use custom image tableViewCell.accessoryType = UITableViewCellAccessoryCheckmark;
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
    tableViewCell.accessoryView.hidden = YES;
    // if you don't use custom image tableViewCell.accessoryType = UITableViewCellAccessoryNone;
}
5

[〜#〜] hig [〜#〜] 121ページに従って、行が選択されているかどうかを示すインジケータとして青色で強調表示された行は推奨されていません。チェックマークでトリックを行います。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    int selectedRow = indexPath.row;
    cout << "selected Row: " << selectedRow << endl;
    UITableViewCell *indexPathForCell = [tableView cellForRowAtIndexPath:indexPath];
    if (indexPathForCell.accessoryType == UITableViewCellAccessoryNone) {
        indexPathForCell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        indexPathForCell.accessoryType = UITableViewCellAccessoryNone;
    }

}

次に、配列を追加するか、選択されたデータを保存する方法を追加します。

2
John Riselvato

Mailの複数選択(たとえば、メールの削除)のようなことをしようとしている場合は、おそらくすべての選択を自分で管理する必要があります。複数行の選択は、iPhoneの標準ではありません。 Mailは、チェックマークを使用して選択された行を示すことでこれを解決します。

2
August

私は同じ問題を探していましたが、Bhavin Chitrodaの答えが私のためにそれを解決しましたが、スクロール中にチェックマークを維持するために追加されました。

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

        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        if ( [array indexOfObject:indexPath] == NSNotFound ) {
            [array addObject:indexPath];
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        } else {
            [array removeObject:indexPath];
            cell.accessoryType = UITableViewCellAccessoryNone;
        }

}

追加:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
// Your code here
.
.
.
    if ( [array indexOfObject:indexPath] == NSNotFound ) {
        cell.accessoryType = UITableViewCellAccessoryNone;
    } else {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }

    return cell;

}
2
Omar Elgendy

注:これはiOS 4以降では機能しません。これは文書化されていないプライベートな定数です。使用しないでください。

アプリをApp Storeに送信する予定がない場合は、UITableViewControllerデリゲートで次のメソッドを実装することにより、複数行編集モードを呼び出すことができます。

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 3; // Undocumented constant
}
1
titaniumdecoy

IOS4.3-6.0でテスト済み

-(void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {

    if ([controller.searchResultsTableView respondsToSelector:@selector(allowsMultipleSelectionDuringEditing)]) {
        controller.searchResultsTableView.allowsMultipleSelectionDuringEditing = YES;
    }
    else {
        controller.searchResultsTableView.allowsSelectionDuringEditing = YES;
    }
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewCellAccessoryCheckmark;
}
0
Adriana