web-dev-qa-db-ja.com

NSArrayを使用してotherButtonTitlesを指定しますか?

UIAlertSheetのコンストラクターは、otherButtonTitlesパラメーターを引数リストとして受け取ります。代わりにNSArrayから他のボタンのタイトルを指定したいのですが。これは可能ですか?

つまり、これを行う必要があります:

id alert = [[UIActionSheet alloc] initWithTitle: titleString
                                  delegate: self
                                  cancelButtonTitle: cancelString
                                  destructiveButtonTitle: nil
                                  otherButtonTitles: button1Title, button2Title, nil];

しかし、実行時に使用可能なボタンのリストを生成しているので、本当に次のようなものが必要です。

id alert = [[UIActionSheet alloc] initWithTitle: titleString
                                       delegate: self
                              cancelButtonTitle: cancelString
                         destructiveButtonTitle: nil
                              otherButtonTitles: otherButtonTitles];

現在、1アイテム、2アイテム、3アイテムに対してinitWithTitle:を個別に呼び出す必要があると考えています。このような:

if ( [titles count] == 1 ) {
     alert = [[UIActionSheet alloc] initWithTitle: titleString
                                         delegate: self
                                cancelButtonTitle: cancelString
                           destructiveButtonTitle: nil
                                otherButtonTitles: [titles objectAtIndex: 0], nil];
} else if ( [titles count] == 2) {
     alert = [[UIActionSheet alloc] initWithTitle: titleString
                                         delegate: self
                                cancelButtonTitle: cancelString
                           destructiveButtonTitle: nil
                                otherButtonTitles: [titles objectAtIndex: 0], [titles objectAtIndex: 1],  nil];
} else {
    // and so on
}

これは多くの重複したコードですが、私は多くて3つのボタンしか持っていないので、実際にはそれは合理的かもしれません。どうすればこれを回避できますか?

54
Steven Fisher

これは1年前のものですが、解決策は非常に簡単です。@ Simonが提案したように実行しますが、キャンセルボタンのタイトルを指定しないでください。

UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString
                              delegate: self
                              cancelButtonTitle: nil
                              destructiveButtonTitle: nil
                              otherButtonTitles: nil];

ただし、通常のボタンを追加した後、次のようにキャンセルボタンを追加します。

for( NSString *title in titles)  {
    [alert addButtonWithTitle:title]; 
}

[alert addButtonWithTitle:cancelString];

ここで重要なステップは、次のように、どのボタンがキャンセルボタンであるかを指定することです。

alert.cancelButtonIndex = [titles count];

[titles count]ではなく[titles count] - 1titlesのボタンのリストから、キャンセルボタンを追加するためです。

ここで、destructiveButtonIndex(通常は[titles count] - 1ボタン)。また、キャンセルボタンを最後のボタンのままにしておくと、iOSによって他のボタンとキャンセルボタンの間にナイススペースが追加されます。

これらはすべてiOS 2.0と互換性があるため、お楽しみください。

72
Ephraim

UIActionSheetを初期化するときにボタンを追加する代わりに、NSArrayを通過するforループを使用してaddButtonWithTitleメソッドでボタンを追加してみてください。

UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString
                              delegate: self
                              cancelButtonTitle: cancelString
                              destructiveButtonTitle: nil
                              otherButtonTitles: nil];

for( NSString *title in titles)  
    [alert addButtonWithTitle:title]; 
52
Simon

addButtonWithTitle:追加されたボタンのインデックスを返します。 initメソッドでcancelButtonTitleをnilに設定し、追加のボタンを追加した後、これを実行します。

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
6
Henrik Lineholm
- (void)showActionSheetWithButtons:(NSArray *)buttons withTitle:(NSString *)title {

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle: title 
                                                             delegate: self
                                                    cancelButtonTitle: nil 
                                               destructiveButtonTitle: nil 
                                                    otherButtonTitles: nil];

    for (NSString *title in buttons) {
        [actionSheet addButtonWithTitle: title];
    }

    [actionSheet addButtonWithTitle: @"Cancel"];
    [actionSheet setCancelButtonIndex: [buttons count]];
    [actionSheet showInView:self.view];
}
4
kokemomuke

キャンセルボタンを追加して、次のように設定できます。

[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle: @"Cancel"]];
2
Ferran Maylinch

私はこれが古い投稿であることを知っていますが、私のような他の誰かがこれを理解しようとしている場合に備えて。

(これは@kokemomukeによって回答されました。これは主により詳細な説明です。@ Ephraimと@Simonにも基づいて構築されています)

[〜#〜] last [〜#〜] addButtonWithTitleのエントリ:Cancelボタンである必要があります。私は使用します:

// All titles EXCLUDING Cancel button
for( NSString *title in titles)  
    [sheet addButtonWithTitle:title];


// The next two line MUST be set correctly: 
// 1. Cancel button must be added as the last entry
// 2. Index of the Cancel button must be set to the last entry

[sheet addButtonWithTitle:@"Cancel"];

sheet.cancelButtonIndex = titles.count - 1;
1
bauerMusic