2011-04-21 5 views
3

가로 방향으로 아이폰에 슬픔을 느끼게하는 작업 시트가 있습니다. 모든 것이 잘 표시되지만, Landscape에서는 첫 번째 실제 버튼이 취소 버튼과 동일한 색인을 가지므로 논리가 작동하지 않습니다.가로 방향의 UIActionSheet에 잘못된 buttonIndicies가 있습니다.

initWithTitle을 사용하여 actionSheet를 생성 해 보았습니다. delegate : cancelButtonTitle : destructiveButtonTitle : otherButtonTitles :하지만 그것은 동일했지만 현재 코드는 다음과 같습니다.

UIActionSheet* actionMenu = [[UIActionSheet alloc] init]; 

actionMenu.delegate = self; 
actionMenu.title = folderentry.Name; 
actionMenu.cancelButtonIndex = 0; 

[actionMenu addButtonWithTitle:NSLocalizedString(@"str.menu.cancel",nil)]; 

[self addActiveButtons:actionMenu forEntry:folderentry]; 
[actionMenu showInView:[self.navigationController view]]; 
[actionMenu release]; 

addActiveButtons 메서드는 기본적으로 어떤 코드를 추가 할 것인지를이 같은 코드를 사용하여 구성합니다.

[menu addButtonWithTitle:NSLocalizedString(@"str.menu.sendbyemail",nil)]; 

가로 모드에서는 여섯 개의 버튼이있을 수 있으므로 actionSheet는 이와 같이 표시됩니다.

action sheet

내 대표는 다음과 같이 응답; 도시 된 실시 예에서

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 

NSLog(@"Cancel Button Index is : %d",actionSheet.cancelButtonIndex); 
NSLog(@"Button clicked was for index : %d",buttonIndex); 

NSString *command = [actionSheet buttonTitleAtIndex:buttonIndex]; 

DLog(@"COMMAND IS: %@ for index: %d",command,buttonIndex); 

if ([command isEqualToString:NSLocalizedString(@"str.menu.sendbyemail",nil)]) { 

    // Do stuff here 

} 

if (... similar blocks ...) { } 

} 

, 나는 cancelButtonIndex 예상대로 0임을 발견하고,하지만 그래서 처음 다른 버튼의 버튼 지수입니다! 즉, 두 번째 (Save to Photos) 버튼을 클릭하면 내 디버그 출력이 다음과 같이 표시됩니다.

취소 버튼 지수 : 1 개

명령은 : 나는 다양한 시도했습니다 1

: 인덱스에 대해 이메일로 보내기 0

버튼 인덱스이었다 클릭 순열과 지금 내가 뭘 놓치고 있는지 궁금해 내 머리를 찢어. 나는 주변에서 좋은 검색을했지만 사람들이 가진 것처럼 보이는 다른 문제는 기능보다는 디스플레이 문제입니다.

어디서 잘못 본 사람이 있습니까?

추신. 나는 이것이 가장 훌륭한 UI 경험이 아니라는 것을 알고 있지만 대부분의 사용자가 실제로 대부분의 시간대에 있거나 앱의 iPad 버전을 사용하고 있기 때문에 내가 할 수 있다고 가정 한 동작 시트 기본 동작을 수락 할 준비가되어있는 것으로 나타났습니다. 실제로 작동하도록하십시오!

답변

4

좋아요, 추가 할 버튼 수를 세고 마지막 옵션으로 취소 버튼을 추가하면됩니다. 따라서 내 코드는 다음과 같습니다.

int added = [self addActiveButtons:actionMenu forEntry:folderentry]; 

[actionMenu addButtonWithTitle:NSLocalizedString(@"str.menu.cancel",nil)]; 
actionMenu.cancelButtonIndex = added; 

다른 사람이 같은 문제를 겪고있는 데 도움이되기를 바랍니다.

+1

설명을 추가하려면이 기술을 사용하려면 취소 단추 제목으로 nil을 initWithTitle : delegate : cancelButtonTitle : destructiveButtonTitle : otherButtonTitles : 메서드에 전달해야합니다. 그런 다음이 답에서 설명한대로 취소 버튼을 마지막에 추가 할 수 있습니다. – kalperin

+0

같은 문제가 발생했습니다. 버그 접수 : rdar : // 11361874 또는 http://www.openradar.me/11361874 –

3

작업 시트의 마지막 단추로 취소 단추를 이미 포함했지만 그에 따라 색인을 설정하더라도 동일한 문제가 발생했습니다. 내 문제는 '파괴적'버튼과 관련이 있습니다. 약간의 조사가 끝나면 여기에 문제가 있습니다.

N 버튼이 작업 시트에 추가 된 후에는 Destructive 버튼이 맨 위에 있고 Cancel 버튼이 버튼에 배치되도록 레이아웃이 전환됩니다.중간에는 다른 모든 단추가 포함 된 스크롤 가능한보기가 있습니다. 다른 출처는 이것이 테이블보기임을 나타냅니다.

iPhone의 경우 N은 세로 방향이 7이고 가로 방향이 5입니다. 이 숫자는 취소 및 파괴 등 모든 버튼에 대한 것입니다.

작업 시트에서 원래 취소 및 소멸 버튼을 작업 시트에 넣은 위치는 중요하지 않습니다. 한도에 도달하면 파괴 단추가 맨 위로 이동하고 취소가 맨 아래로 이동합니다.

문제는 색인이 그에 따라 조정되지 않는다는 것입니다. 따라서 처음에 Cancel을 마지막 버튼으로 추가하고 Destructive를 첫 번째로 추가하지 않은 경우 초기 보고서가 명시한대로 actionSheet : clickedButtonAtIndex :에 잘못된 색인이보고됩니다.

액션 시트에 N 개 이상의 버튼이있는 경우 반드시 액션 시트의 첫 번째 버튼으로 액션 버튼에 파괴 버튼을 추가해야합니다. 작업 시트에 추가 된 마지막 단추로 취소 단추를 추가해야합니다. 처음에 시트를 만들 때 다른 답변에 설명 된대로 둘 다 nil로 남겨 둡니다.

0

나는 동일한 문제가있었습니다. 이를 해결하기 위해 모든 버튼에 대해 nil을 사용하여 actionSheet를 만들고 나중에 수동으로 버튼을 추가했습니다. 마지막으로, 처리기에서 firstOtherButtonIndex를 무시합니다 (미리 설정 한 경우에도 마찬가지입니다). 이 예제에서는 인덱스 0이 취소 단추이므로 1이라고 가정합니다. 여기 코드는 다음과 같습니다

또한
NSArray *items = [NSArray arrayWithObjects:@"one", @"two", @"three", nil]; 
UIActionSheet* actionSheet = [[[UIActionSheet alloc] initWithTitle:@"Title" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil] autorelease]; 
[actionSheet addButtonWithTitle:@"Cancel"]; 
for (NSString *title in items) { 
    [actionSheet addButtonWithTitle:title]; 
} 
[actionSheet addButtonWithTitle:@"Destroy"]; 

// set these if you like, but don't bother setting firstOtherButtonIndex. 
actionSheet.cancelButtonIndex = 0; 
actionSheet.destructiveButtonIndex = [items count]+1; 

는, 탭 표시 줄이 터치 이벤트를 훔치고 명중에서 아래 버튼을 방지하기 때문에 당신이 아이폰에 있다면 탭보기에서이를 표시하는 것을 잊지 마세요.

0
내 솔루션이 지정에만 destructiveButtonTitle처럼 초기화하는 것입니다

...

UIActionSheet * as =[[[UIActionSheet alloc] initWithTitle:nil 
               delegate:self 
             cancelButtonTitle:nil 
            destructiveButtonTitle:@"Cancel" 
             otherButtonTitles:nil] autorelease]; 
[as addButtonWithTitle:@"Button 1"]; 
[as addButtonWithTitle:@"Button 2"]; 

당신은 항상 인덱스 0에서 취소 버튼을 자신 만의 버튼 인덱스 1에서 시작 얻을 그런 식으로 스크롤이 있더라도 전망.

관련 문제