UIActionSheet 취소 버튼 비정상적인 동작


116

사용자에게 수행 할 작업에 대한 선택권을 제공하기 위해 작업 시트를 여는 UIBarButtonItem이 있습니다. "취소"버튼을 클릭하지 않는 한 모든 것이 예상대로 작동합니다. 버튼의 대상이 있어야하는 위치에서 위로 이동 한 것으로 보입니다. "취소"와 "확인"버튼의 중간을 클릭해야만 활성화 할 수 있습니다.

나는 다른 응용 프로그램에서 액션 시트를 시도해 보았고 잘 작동하므로 내 엄지 손가락이 아닙니다. 작업 시트가 UIViewController에서 열립니다.

- (void)showOpenOptions
{
    UIActionSheet *sheet = [[UIActionSheet alloc] 
    initWithTitle:NSLocalizedString(@"Open link in external application?", @"Open in external application")
    delegate:self
    cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel")
    destructiveButtonTitle:NSLocalizedString(@"Open Link", @"Open Link")
    otherButtonTitles:nil];

    [sheet showInView:self.view];
    [sheet release];
}

5
관련없는 메모에서, 저는 Apple UI 검토 세션 중에 WWDC에서 Action Sheets의 빨간색 버튼이 실제로 '파괴적인'작업 (즉 '삭제')을위한 것이라고 들었습니다.
— Ramin

예, 저는 최근에 휴먼 인터페이스 지침을 읽고 그것을 보았습니다. 빨간색에서 회색으로 변경했습니다.
— nevan king

답변:


190

현재보기 컨트롤러의보기를 작업 시트에 전달하는 대신의 showFromTabBar:메서드를 사용합니다 UIActionSheet.

올바른 방법
이것은 올바른 탭 가능 영역을 제공합니다.

[actionSheet showFromTabBar:self.tabBarController.tabBar];

잘못된 방법
이렇게하면 탭할 수있는 영역이 잘못된 위치에 배치됩니다 (탭 막대 또는 도구 모음을 사용하는 경우).

[actionSheet showInView:self.view];

툴바 를 사용하는 경우 showFromToolbar:대신 방법을 사용하세요. 툴바에 대한 참조가 필요합니다. 대부분의 경우 ivar

[actionSheet showFromToolbar:self.myToolbar];

My Old Answer 도 작동하지만 해킹됩니다.

가능한 답을 찾았습니다.

2008 년 12 월 1 일 10:22 PM Tom Saxton :이 버그를 좀 더 살펴 봤는데 탭 바에 문제가있는 것 같습니다.

UITabViewController의 자식 인 뷰 컨트롤러에서 UIActionSheet의 [sheet showInView : self.view]를 호출하면 취소 버튼에 대한 적중 테스트가 탭바의 뷰 위에있는 UIActionSheet 부분에서 실패합니다.

대신 UITabBarController의 뷰를 전달하면 UIActionSheet가 예상대로 작동합니다.

참고 : iPhone OS 2.1 및 이전 버전에서는 UIActionSheet가 자식보기를 통과 할 때 탭 표시 줄의 맨 위에서 표시되었지만 2.2에서는 탭 표시 줄의 맨 아래에서 표시되므로 탭보기를 덮습니다.

http://openradar.appspot.com/6410780

편집 : 보기를 탭 모음의보기로 변경하면 제대로 작동합니다.

[sheet showInView:self.parentViewController.tabBarController.view];

작동하기 때문에 이것을 찬성했습니다. 이것이 다른 답변보다 나은 이유는 무엇입니까?
— bentford 2009-08-26

1
왜 parentViewController입니까? 보기가 navigationview에 있더라도 tabBarController는 여전히 올바른 위치를 가리켜 야합니다. 어쨌든 parentViewController없이 나를 위해 작동합니다.
— Nathan

11
또 다른 대답은 잠재적으로 더 나은 것 같습니다. [actionSheet showInView : [self.view window]]를 찾습니다. 더 간단하고 더 일반적입니다.
— Kevin

이 답변을 게시 해 주셔서 감사합니다.
— fulvio

1
내 앱에 탭 바가 없지만 여전히 그런 문제가 있습니다. '[serf.view window]'로 해결했습니다. 어쨌든 탭 바 문제가 아닙니다.
— Mike Keskinov 2012

37

여기 에서 작동 하는 답을 찾았습니다 .

사용 : [filterActionSheet showInView:[self.view window]];

내 탭 표시 줄에 액세스하는 몇 가지 방법을 시도했는데이 앱이 설정되는 방식이 복잡해 보입니다 ...


완전한! 감사. 내가 도구 모음 있던있는 UITableViewController이 문제 가졌다 이것은 나를 위해 올바른 솔루션입니다 하지 여기에 다른 사람과 같은 TabBar의를.
— William Denniss

좋은 물건, 이것은 나를 위해 일했습니다! 이것이 가장 쉬운 방법입니다!
— cgossain 2011

2
또 다른 문제가 발생합니다. ActionSheet는 장치가 가로 모드 일 때 세로 방향으로 표시됩니다 (다른 모든 콘텐츠 포함).
— Mike Keskinov 2010

22

대신 다음을 사용하십시오.

[sheet showFromTabBar:theTabBar];

1
나는 이것을에서 showInTabBar:으로 수정 했습니다 showFromTabBar:. 또한 화면 하단에있는 화면 가구에 따라 'showFromToolbar :'메소드가 있습니다. 이것은 받아 들여진 대답보다 더 나은 대답이라고 생각합니다.
— Stephen Darlington

Stephen, 왜 이것이 showInView : theTabBar를 지정하는 것보다 낫다고 생각하는지 궁금하십니까? 커플 링 관점에서 볼 때 나중에 tabBar가 삭제되거나 도구 모음으로 대체되는 경우에 대비하여 showInView가 더 이상적이라고 생각합니다. 특정 서브 뷰 컨트롤러는 실제로 알거나 신경 쓸 필요가 없다고 생각합니다.
— Billy Gray

나중에 탭 표시 줄을 삭제하면 해당 코드 줄을 편집해야합니다 (TabBar가 전달 된 뷰에 대한 이름이 잘못된 참조가 아닌 경우). 따라서이 메서드가 showInView : theTabBar보다 더 결합 된 방식을 알지 못합니다. showFromTabBar :도 사용합니다. 더 안전 해 보입니다. 커버 아래에서 무슨 일이 벌어지고 있는지 모르겠지만 showFromTabBar :가 탭 바보기를 사용하는 showFromView :보다 향후 OS 릴리스에서 중단 될 가능성이 적다고 생각합니다.
— Christopher Pickslay 2010 년

10

수정 사항은 다음과 같습니다.

[actionsheet showInView:[UIApplication sharedApplication].keyWindow];

5

세 가지 답변의 조합이 이것을 처리하는 올바른 방법이라고 생각합니다.

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

즉, showFromTabBar를 사용하십시오 (그게 존재하는 이유입니다) Nathan이 지적한 것처럼 parentViewController가 필요하지 않습니다 (사실 self.parentViewController.tabBarController.tabBar는 나를 위해 nil을 반환합니다.


물론 부모 뷰 컨트롤러 (UITabBarViewController)가 다른 UITabBarController에 중첩되지 않았기 때문에 nil을 반환하므로 tabBarController-property는 nil입니다.
— Dominik Seibold 2011

1

참고로-UIDocumentInteractionController의 작업 시트가 탭 바를 밟는 것과 동일한 문제가 발생했습니다. 다음을 사용하여 수정했습니다.

UIViewController *parentView = [[self parentViewController] parentViewController];
[docController presentOptionsMenuFromRect: rect inView: parentView.view animated:YES];

-2

간단한 코드 작성

 actionSheet.actionSheetStyle = UIActionSheetStyleDefault;

이것은 잘 작동한다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.