iOS8-iOS11의 액션 시트 대리자에서 모달로 뷰 컨트롤러 표시
그래서 iPad의 iOS8 베타 3 ( 업데이트 : iOS 11.2에서 여전히 발생)의 델리게이트 메서드 내에서 뷰 컨트롤러를 표시하려고 할 때 UIActionSheet
"아무것도"발생하지 않고 로그 메시지가 디버그 콘솔에 출력된다는 것을 알았습니다. 경고 컨트롤러를 전환하는 동안 프레젠테이션을 시도했음을 나타냅니다.
Warning: Attempt to present <UIViewController: 0x...> on <ViewController: 0x...> which is already presenting <UIAlertController: 0x...>
업데이트 : iOS 9 SDK UIActionSheet
부터는 더 이상 사용되지 않으므로이 문제에 대한 수정을 기대하지 마십시오. UIAlertController
가능하면 사용을 시작하는 것이 가장 좋습니다 .
문제 UIAlertController
는 경고보기 및 작업 시트의 기능을 구현하기 위해 내부적으로 사용하는 Apple의 전환에서 비롯된 것 같습니다 . 이 문제는 대부분 iPad 및 작업 시트에서 나타납니다 .iPad에서 작업 시트는 지정된보기 내에서 팝 오버로 표시되고 Apple이하는 일은보기 컨트롤러를 찾고 presentViewController:animated:completion:
내부 .NET 을 호출 할 때까지 응답자 체인을 이동하는 것 UIAlertController
입니다. 문제는 iPhone과 경고보기에서 덜 분명합니다. Apple이 실제로 별도의 창, 빈보기 컨트롤러를 만들고 UIAlertController
그 위에 내부 를 표시하므로 다른 프레젠테이션을 방해하지 않는 것 같습니다.
이 문제에 대한 버그 보고서를 열었습니다 : rdar : // 17742017 . 복사하여 Apple에 이것이 문제임을 알리십시오.
해결 방법으로 다음 방법을 사용하여 다음 실행 루프까지 프레젠테이션을 지연하는 것이 좋습니다.
dispatch_async(dispatch_get_main_queue(), ^ {
[self presentViewController:vc animated:YES completion:nil];
});
당신은 당신의 일 (보기 컨트롤러 제시)을 시도 할 수 있습니다.
- (void) actionSheet:(UIActionSheet *)actionSheet
didDismissWithButtonIndex:(NSInteger)buttonIndex {}
대신에
- (void) actionSheet:(UIActionSheet *)actionSheet
clickedButtonAtIndex:(NSInteger)buttonIndex {}
@LeoNatan이 말했듯이 "문제는 경고보기 및 작업 시트의 기능을 구현하기 위해 내부적으로 UIAlertController를 사용하는 Apple의 전환에서 비롯된 것 같습니다" . 따라서 액션 시트가 닫힐 때까지 기다린 다음 원하는 뷰 컨트롤러를 제시해야합니다.
@LeoNatan의 솔루션은 메인 스레드에서 UI를 차단하기 때문에 액션 시트가 해제 된 후 뷰 컨트롤러가 표시되는지 확인합니다.
불행히도이 코드는 나를 위해 작동하지 않습니다. 제 문제는 presentController 메서드를 직접 호출하지 않고 prepareForSegue 메서드에서 사용하여
[segue destinationViewController]
segue가 "push"종류이면 모두 올바르게 작동하지만 "modal"이면 ipad에서만 오류가 발생합니다.
그런 다음 segue 패널의 스토리 보드에서 몇 가지 새로운 옵션을 찾았고 프레젠테이션 옵션으로 "현재 컨텍스트"를 선택하는 문제를 해결했습니다.
다른 사람에게 도움이되기를 바랍니다. 옵션에 대한 스크린 샷이 있습니다.
나는 이와 같은 문제가 있었다. 내 appdelegate에서 경고 및 작업 시트에 대한 별도의 창을 만들고 경고를 표시했습니다. 그것은 나를 위해 일했습니다!
self.alertWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.alertWindow.backgroundColor = [UIColor clearColor];
UIViewController *dummy = [[UIViewController alloc] init];
[self.alertWindow setRootViewController:dummy];
다음과 같이 발표 할 수 있습니다.
[[myAppDelegate appDelegate].alertWindow makeKeyAndVisible];
[[myAppDelegate appDelegate].alertWindow.rootViewController presentViewController:alertController animated:YES completion:nil];
다음 코드로 Swift 3에서 수정했습니다.
DispatchQueue.main.async {
self.present(alertController, animated: true, completion: nil)
}
발행
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
의 위에
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
다른 모달 뷰를 제시하기 전에 나를 위해 일했습니다.
사용하다
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
대신에
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
작업보기는 현재 VC 위에 표시되므로 경고 / 오류가 발생합니다. didDismiss가 호출되면 조치보기가 이미 닫히므로 전혀 문제가 없습니다. :))
시험
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// action sheet presentation
// or modal view controller presentation
// or alert view presentation
}];
iOS 8에서 Apple은 내부적으로 UIAlertController를 사용하여 경고보기 및 작업 시트의 기능을 구현합니다. 따라서 UIActionSheet 또는 UIAlertView를 다음과 같은 대리자 메서드에 표시 한 후 UIViewController를 모달로 표시하려면
(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
과
(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
먼저 다음과 같이 UIAlertController를 닫아야합니다.
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
[vc dismissViewControllerAnimated:NO completion:^{
}];
}
이제 iOS 8에서 모달 UIViewController를 표시 할 수 있습니다.
'Programing' 카테고리의 다른 글
알림에서 애플리케이션 및 스택 재개 (0) | 2020.12.10 |
---|---|
AngularJS 지시문 : UI에 반영되지 않은 $ scope 변경 (0) | 2020.12.10 |
변경시 선택에서 선택한 값 / 텍스트 가져 오기 (0) | 2020.12.10 |
목록에 중복 된 값이있는 목록을 찾는 방법 (0) | 2020.12.10 |
사용자가 페이지를 떠날 때 angularjs에 경고 표시 (0) | 2020.12.10 |