varlist가 아닌 배열을 전달하여 UIActionSheet 'otherButtons'를 만듭니다.


110

UIActionSheet의 단추 제목에 사용할 문자열 배열이 있습니다. 불행히도 메서드 호출의 otherButtonTitles : 인수는 배열이 아닌 가변 길이 문자열 목록을 사용합니다.

그렇다면 이러한 제목을 UIActionSheet에 어떻게 전달할 수 있습니까? 내가 제안한 해결 방법은 nil을 otherButtonTitles :에 전달한 다음 addButtonWithTitle :을 사용하여 버튼 제목을 개별적으로 지정하는 것입니다. 그러나 이것은 "취소"버튼을 UIActionSheet의 마지막 위치가 아닌 첫 번째 위치로 이동시키는 문제가 있습니다. 나는 그것이 마지막이기를 원합니다.

1) 문자열의 변수 목록 대신 배열을 전달하거나 2) 취소 버튼을 UIActionSheet의 맨 아래로 이동하는 방법이 있습니까?

감사.


이것이 작동하는지 확실하지 않지만 UIActionSheet의 cancelButtonIndex 속성은 읽기 전용이 아닙니다. 그것을 설정하고 버튼의 순서가 변경되는지 확인하십시오.
lostInTransit

답변:


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 속성을 설정할 수 있다는 사실을 몰랐습니다. 우리 모두가 동의 할 수 있다고 생각하는 한 가지는 애플의 API가 형편 없다.
Greg Maletic 2010 년

11
두 번째입니다! 그리고 문서의 99,99 %도 엉망입니다. 그 언어를 모르고 고대 히브리어로 쓰여진 책에서 뇌 수술을 배우려고하는 것과 같습니다.
Duck (Duck)

4
이만큼 더 많이 투표 할 수 있기를 바랍니다. 크래킹 대답과 나는 이것에 대해 알지 못하고 이렇게 오래 갔다는 것을 믿을 수 없습니다!
mattjgalloway 2012

1
@JimThio cancelButton는 빨간색이 아닙니다. 은 destructiveButton빨간색입니다.
Armin

1
안타깝게도이 솔루션 [UIActionSheet addButtonWithTitle]은 올바르게 설정되지 않은 것으로 보이는 UIActionSheet의 버그로 인해 어려움을 겪습니다 firstOtherButtonIndex( actionSheet:clickedButtonAtIndex:0 또는 유사한 항목을 하드 코딩하는 대신 대리자에서 사용해야 함 ). 를로 변환하는 NSArray데 불쾌감을 느끼는 va_list것도 훌륭한 솔루션처럼 들리지 않습니다. :-(이 API는 너무 못
생겼습니다

78

작은 참고 사항 : [actionSheet addButtonWithTitle :]은 해당 버튼의 색인을 반환하므로 안전하고 "깨끗"하려면 다음과 같이 할 수 있습니다.

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

취소 버튼이 빨간색으로 바뀔까요?
user4951

1
@JimThio 아니요, 빨간색 버튼은 "destructiveButton"이라고하며 각각에 destructiveButtonIndex대한 속성 이 있습니다
Nick

3

Jaba와 Nick의 답변을 가져 와서 조금 더 확장하십시오. 이 솔루션에 파괴 버튼을 통합하려면 :

// 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에 delegate를 추가하십시오.

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.