varlistではなく配列を渡して、UIActionSheet 'otherButtons'を作成します。


110

UIActionSheetのボタンタイトルに使用する文字列の配列があります。残念ながら、メソッド呼び出しのotherButtonTitles:引数は、配列ではなく、文字列の可変長リストを受け取ります。

では、これらのタイトルをUIActionSheetに渡すにはどうすればよいですか?私が見てきた回避策は、nilをotherButtonTitles:に渡してから、addButtonWithTitle:を使用してボタンのタイトルを個別に指定することです。しかし、これには「キャンセル」ボタンをUIActionSheetの最後ではなく最初の位置に移動するという問題があります。最後になりたいです。

1)文字列の変数リストの代わりに配列を渡す方法、または2)キャンセルボタンをUIActionSheetの下部に移動する方法はありますか?

ありがとう。


これが機能するかどうかはわかりませんが、UIActionSheetのcancelButtonIndexプロパティは読み取り専用ではありません。設定してみて、ボタンの順序が変わるかどうか確認してください。
lostInTransit 2010年

回答:


248

私はこれを機能させました(必要なのは、通常のボタンで大丈夫で、その後に追加するだけです:

NSArray *array = @[@"1st Button",@"2nd Button",@"3rd Button",@"4th Button"];

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Title Here"
                                                             delegate:self
                                                    cancelButtonTitle:nil
                                               destructiveButtonTitle:nil
                                                    otherButtonTitles:nil];

    // ObjC Fast Enumeration
    for (NSString *title in array) {
        [actionSheet addButtonWithTitle:title];
    }

    actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];

    [actionSheet showInView:self.view];

19
これは機能します。ありがとう。cancelButtonIndexプロパティを設定できることを理解していませんでした。私たち全員が同意できると私が思うことの1つは、これはAppleのAPIである。
グレッグマレティック2010年

11
私はこれを2番目に!そして、彼らのドキュメントの99,99%はまた悪いです。それは、その言語を知らずに古風なヘブライ語で書かれた本から脳外科を学ぼうとするようなものです。
ダック

4
これ以上何回でも賛成票を投じられればと思います。答えがひどいので、このことを知らずに長い間行ったなんて信じられません。
mattjgalloway

1
@JimThio cancelButtonは赤ではありません。destructiveButton赤です。
Armin 2013

1
悲しいことに、このソリューションは、[UIActionSheet addButtonWithTitle]正しく設定されていないように見えるUIActionSheetのバグに悩まされていますfirstOtherButtonIndexactionSheet:clickedButtonAtIndex:0や類似のものをハードコーディングするのではなくデリゲートで使用する必要があります)。NSArraytoへの変換で厄介にva_listなることも、優れたソリューションのようには聞こえません。:-(このAPIはとても気醜いです。
ダニエルリンザー

78

ちょっとしたメモ:[actionSheet addButtonWithTitle:]はそのボタンのインデックスを返すので、安全かつ「クリーン」にこれを行うことができます:

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];

キャンセルボタンが赤くなりますか?
user4951 2013年

1
@JimThioいいえ、赤いボタンは「destructiveButton」と呼ばれdestructiveButtonIndex、それに対応するプロパティがあります
Nick

3

ジャバとニックの答えを取り入れて、もう少し拡張します。このソリューションに破棄ボタンを組み込むには:

// Create action sheet
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:title
                                                         delegate:self
                                                cancelButtonTitle:nil
                                           destructiveButtonTitle:nil
                                                otherButtonTitles:nil];
// Action Buttons
for (NSString *actionName in actionNames){
    [actionSheet addButtonWithTitle: actionName];
}

// Destruction Button
if (destructiveName.length > 0){
    [actionSheet setDestructiveButtonIndex:[actionSheet addButtonWithTitle: destructiveName]];
}

// Cancel Button
[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle:@"Cancel"]];

// Present Action Sheet
[actionSheet showInView: self.view];

1

応答の迅速なバージョンがあります:

//array with button titles
private var values = ["Value 1", "Value 2", "Value 3"]

//create action sheet
let actionSheet = UIActionSheet(title: nil, delegate: self, cancelButtonTitle: nil, destructiveButtonTitle: nil)
//for each value in array
for value in values{
    //add a button
    actionSheet.addButtonWithTitle(value as String)
}
//display action sheet
actionSheet.showInView(self.view)

選択された値を取得するには、ViewControllerにデリゲートを追加します。

class MyViewController: UIViewController, UIActionSheetDelegate

そして「clickedButtonAtIndex」メソッドを実装します

func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
    let selectedValue : String = values[buttonIndex]
}

将来のユーザーのために...それは機能しました...しかしそれは非推奨です... stackoverflow.com/a/41322537/884674を
jeet.chanchawat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.