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つのボタンしか持っていないので、実際にはそれは合理的かもしれません。どうすればこれを回避できますか?
これは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] - 1
titles
のボタンのリストから、キャンセルボタンを追加するためです。
ここで、destructiveButtonIndex(通常は[titles count] - 1
ボタン)。また、キャンセルボタンを最後のボタンのままにしておくと、iOSによって他のボタンとキャンセルボタンの間にナイススペースが追加されます。
これらはすべてiOS 2.0と互換性があるため、お楽しみください。
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];
addButtonWithTitle:追加されたボタンのインデックスを返します。 initメソッドでcancelButtonTitleをnilに設定し、追加のボタンを追加した後、これを実行します。
actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
- (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];
}
キャンセルボタンを追加して、次のように設定できます。
[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle: @"Cancel"]];
私はこれが古い投稿であることを知っていますが、私のような他の誰かがこれを理解しようとしている場合に備えて。
(これは@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;