UIAlertSheet のコンストラクタは、otherButtonTitles パラメータを varg リストとして受け取ります。代わりに、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];
initWithTitle:
現時点では、 1 つのアイテム、2 つのアイテム、3 つのアイテムごとに別々の呼び出しを行う必要があると考えています。次のようになります。
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
これは 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 と互換性があるので、お楽しみください。