54

UIAlertSheet のコンストラクターは、varg リストとして 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];

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 つしかないので、実際には妥当かもしれません。どうすればこれを回避できますか?

4

6 に答える 6

72

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

于 2012-11-28T22:05:37.660 に答える
52

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]; 
于 2009-10-21T17:23:29.530 に答える
6

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

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
于 2013-08-24T05:21:15.497 に答える
4
- (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];
}
于 2012-12-25T07:28:36.310 に答える
2

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

[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle: @"Cancel"]];
于 2014-02-18T17:06:09.850 に答える