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.