Programing

iOS8-iOS11의 액션 시트 대리자에서 모달로 뷰 컨트롤러 표시

lottogame 2020. 12. 10. 08:24
반응형

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를 표시 할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/24854802/presenting-a-view-controller-modally-from-an-action-sheets-delegate-in-ios8-i

반응형