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

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

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 と互換性があるので、お楽しみください。

おすすめ記事