<FirstViewController : 0x2a2c00>의 모양 전환을 시작 / 종료하기위한 불균형 호출


93

내 앱을 시뮬레이션 할 때이 문제가 발생합니다. 오류나 경고는 아니지만 내 콘솔에 나타납니다. 이전에이 문제를 경험 한 사람이 있습니까?


그 뷰 컨트롤러에서 어떤 종류의 애니메이션을 만드나요?

1
예. 이미지로 분리되는 시작 애니메이션이 있습니다. 이제 휴대폰에 코드를로드 할 때만이 오류가 발생한다는 것을 알았습니다.
C.Johns

오류 메시지는 전환 시작을 제안하지만 해당하는 end 메서드에 대한 호출이 누락되었습니다.

1
같은 것을 얻었습니다. 이것에 대한 해결책이 있습니까?
seeafish

또한 이것에 대한 해결책을 찾고 있습니다
barfoon 2011

답변:


48

제 경우에는 테이블 뷰에서 두 개의 탭을 매우 빠르게 클릭하면이 오류가 발생합니다.

그 결과 잘못된 제목 이름이 발생하고 뒤로 버튼이 사라집니다. 누군가 뷰를 푸시 할 때 set animated:NO. 오류가 사라지지만 여전히 이상한 동작이 발생합니다. 두 개의 뷰를 푸시 한 다음 테이블 뷰 화면으로 돌아가려면 두 번 뒤로 돌아 가야합니다.

이 문제를 해결하기 위해 시도한 방법 :

더하다 BOOL cellSelected;

viewWillAppear cellSelected = YES;

didselectcell 델리게이트에서 if (cellSelected){cellSelected = NO; do action ; }

이렇게하면 두 개의 다른 셀을 매우 빠르게 클릭하는 것을 방지 할 수 있습니다.


5
제 생각에는 일부 문구가 이해하기 어려웠습니다. 가독성을 높이기 위해 몇 가지 수정을했습니다.
Kyle Clegg

42

제 경우에는 항목의 메서드 [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];내에서 트리거 할 때 발생했습니다 .UINavigationControllerviewDidLoad

그것을 viewDidAppear방법 으로 옮기면 문제가 해결되었습니다.

그 이유는 viewDidLoad모든 멋진 애니메이션이 이미 완료된 것은 아니지만 모든 것이 완료 되었기 viewDidAppear때문입니다.


감사. 나는 코드를 통해 모든 단일 UI 요소를 만드는 원시인 시대에서 길을 잃었습니다. 스토리 보드는 저에게 새로운 것입니다.
Kiran Kulkarni 2014 년

21

나도이 문제가있다. 이 문제에 대한 두 가지 해결책을 찾았습니다.

  1. 이 솔루션은 위에서 볼 수 있습니다.
  2. UINavigationController이 문제가 해결 된 하위 클래스를 찾았습니다 . 버퍼링 된 탐색 컨트롤러

15

이를 방지하려면 다른 루프에서 코드를 실행해야합니다.

 double delayInSeconds = 0.1;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            // Put your code here
[self presentViewController:self.yourModalVC animated:YES completion:nil];
        });

7
더 나은 아이디어는 프리젠 테이션 애니메이션 dispatch_async을 주 대기열에 포함하는 것입니다. 문제 dispatch_async는 메인 대기열의 다른 모든 애니메이션이 완료 될 때까지 대기한다는 것입니다. 다음과 같은 이유로 지연을 사용하는 것보다 훨씬 낫습니다. 1- 지연이 충분한 지 결코 알 수없고, 호스트 장치에 따라 다릅니다. 2- 지연을 과도하게 사용하고 무언가 지연 될 수 있습니다. 이 시도 :dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
M. Porooshani에게

12

나는 같은 문제에 많은 문제가 있었다. 나는 이것을 이렇게 해결했다

1) UIViewController's지정된 이니셜 라이저를 사용하고 있지 않습니다 initWithNibName:bundle:. 대신 사용하십시오 init.

2) animated:YESNO로 설정 하면 문제가 해결되었습니다. 예.[self.navigationController pushViewController: viewController_Obj animated:NO];


7

내비게이션 컨트롤러를 사용하여 동일한 문제가 발생했으며 다른 컨트롤러를 푸시했습니다. Buffered Navigation Controller 와 여러 다른 접근 방식 을 사용하려고했지만 작동하지 않았습니다. 그것을 알아내는 데 약간의 시간을 보낸 후 이전 트랜잭션 (애니메이션)이 진행되는 동안 새 뷰 컨트롤러를 푸시하려고하면이 문제가 발생한다는 것을 알았습니다 (약 0.5 초 지속 시간). 어쨌든 내비게이션 컨트롤러를 위임하고 이전 애니메이션이 끝날 때까지 기다리면서 빠른 솔루션을 만들었습니다.


감사합니다! 내 논리를 viewDidAppear로 이동하면 내 상황에 도움이되었습니다.
Jaroslav

7

-viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear에서 해당 메서드의 오버로드에서 적절한 수퍼 메서드를 호출하는 것을 잊지 마십시오. 예를 들어 제 경우에는 다음과 같이 메서드 이름이 일치하지 않습니다.

-(void)viewDidAppear
{
 [super viewDidDisappear];
 //some code staff
 ..
}

통지 표시 하고 사라 방법은 일치하지 않는


이 문제를 디버깅하는 데 약 2 시간이 걸렸고 이것이 밝혀졌습니다. 호출 super.viewWillAppear()내에서 viewDidDisappear().
Daniel Wood

이 팁에 감사드립니다. 내 유일한 문제는 아니지만 도움이되었습니다!
Anthony C

4

''에 대한 외모 전환 시작 / 종료를위한 불균형 통화

마지막 관련 애니메이션이 완료되기 전에 애니메이션이 시작된다고 말합니다. 그래서, 당신은 새로운 것을 밀기 전에 뷰 컨트롤러를 터 뜨리고 있습니까? 아니면 뿌리를 내릴 수 있습니까? 그렇다면 애니메이션없이 시도해보십시오.[self.navigationController popToRootViewControllerAnimated:NO];

그리고 이것이 문제를 해결하는지 확인하십시오. 제 경우에는 이것이 트릭이었습니다.


1
이것이 핵심입니다. 동시에 다른 뷰 컨트롤러 전환을 팝하거나 변경합니다.
Rocky

2

UITabbar가없고 UINavigationBar도없는 viewController에서 UIPrintInteractionController를 호출했기 때문에이 문제가 발생했습니다. UIPrintInteractionController가 올바른 printInteractionControllerParentViewController를 얻지 못한 것 같습니다. 대리자에서 메서드를 구현하고 현재 rootViewController를 반환하면 나를 위해 일했습니다.

    - (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;

2

모달 대화 상자 되감기와 관련된 비슷한 문제가 있습니다. 여기에 솔루션 게시 ...

https://stackoverflow.com/a/38795258/324479

[문제]

Nav 컨트롤러-> VC1 -Push-> VC2 -PopOver 또는 Modal Segue-> VC3.

VC3가 VC1로 다시 풀립니다.

VC2에서 VC3 로의 Segue가 PopOver 및 Modal 인 경우 해제는 경고로 끝납니다. UIViewController의 모양 전환을 시작 / 종료하기위한 불균형 호출 "

VC에서 VC 로의 Segue가 푸시되면 경고가 사라집니다.

[해결책]

풀기 로직이 이것을 처리한다면 좋을 것입니다. 버그 일 수도 있고 아닐 수도 있습니다. 어느 쪽이든 해결책은 VC2 (팝업이있는 컨트롤러)를 되감기 대상으로 만든 다음 탐색 컨트롤러를 팝업하기 전에 표시가 완료 될 때까지 기다리는 것입니다. 이렇게하면 되감기 (역 팝업) 애니메이션이 더 뒤로 이동하기 전에 완료 할 시간이 충분합니다. 애니메이션이 꺼져 있어도 여전히 기다려야합니다. 그렇지 않으면 오류가 발생합니다.

VC2의 코드는 다음과 같아야합니다. (빠른)

class VC2: UIViewController {
    private var unwind = false
    @IBAction func unwindToVC1(segue:UIStoryboardSegue) {
        unwind = true
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        if unwind {
            self.navigationController?.popViewControllerAnimated(false)
        }
    }
}

1

모달 뷰 컨트롤러가있는 뷰를 하위 뷰로 추가하는 경우 상황이 발생할 수 있습니다. 사용하기 가장 좋은 방법 :

-(void) viewDidAppear:(BOOL)animated {
    [self presentViewController:self.yourModalVC animated:YES completion:nil];
}

기본적으로 표시하려는 viewController에 대해 뷰 라이프 사이클이 간소화되지 않았다는 의미입니다.


1

할 때 비슷한 문제가 있습니다.

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];

와 같은 함수에서 함수 끝에 - (void) popUpToLevelTwo;a를 넣으면 return;문제가 해결됩니다.


1

나는 또한 이것을 얻었다

[self dismissModalViewControllerAnimated:YES];

나는 변경 YESA를 NO, 그 문제를 해결했다.


1

내 앱에서 내비게이션 컨트롤러의 팝 메서드를 사용할 때도 같은 문제가 발생합니다. 내 앱에서 내비게이션 컨트롤러에 별도의 로직을 사용하므로 내비게이션 바의 사용을 피하고 항상 숨겨져 있습니다. 그런 다음 뒤로 버튼과 이벤트를 처리하기 위해 사용자 정의보기 및 알림을 사용합니다. 알림 관찰자는 등록되며 제거되지 않습니다. 따라서 알림이 두 번 실행되고 위에서 언급 한 오류가 발생합니다. 그러한 결함을 얻기 위해 코드를 철저히 확인하십시오.


1

무엇의 가치를 위해, 나는에 대한 호출을 포함하지 않는이 같은 오류가있어 [super viewDidLoad:animated]내에서 viewDidLoad재정을.


1
아마도 viewDidAppear를 의미합니까? 있는 viewDidLoad에는 매개 변수가 없습니다
파비오 Napodano에게

1

NIB에서 버튼을 탭했을 때도이 문제가 발생했습니다. 실수로 두 개의 IBAction 메서드에 이벤트를 보내기 위해 버튼을 연결했는데, 각각은 pushViewController : animated를 수행했습니다.


감사 !! 당신은 내 시간을 절약!
VD

1

UIViewController모든 데이터가 다운로드 될 때 까지 푸시를 기다리는 로직을 구현했습니다 . 이 로직에 오류 UIViewController가있어서 아직 다른 API 호출이 진행중인 동안 너무 일찍 푸시했습니다 .

그것은 같은 UIViewController것을에 의해 두 번 밀고이 UINavigationController경고를주었습니다.


1

이유는 메시지에 대해 : 이 메시지가 표시 얻을 경우, 당신은 밀어 경우에만 /에서 또 다른 뷰 컨트롤러를 제시 viewWillAppear, loadView, init또는 viewDidLoad방법은 현재보기 컨트롤러의

오류 메시지를 제거하는 방법 : 푸시 / 제시 코드를 viewDidAppear메서드로 이동 하면 문제가 해결됩니다.


1

스위프트 4

내 문제는 현재 렌더링이 완료되기 전에 다른 VC를 제시하고 있었다는 것입니다.

해결책은 빠른 지연 후 내 nextVC를 제시하는 것이 었습니다.

하지 말아야 할 일

override func viewDidLoad() {
    super.viewDidLoad() 
    self.present(MyNextVC(), animated: true, completion: nil)
}

해야 할 일

override func viewDidLoad() {
    super.viewDidLoad() 
    //Wait until the view finished to be constructed
    perform(#selector(showMyNextVC), with: nil, afterDelay: 0.01)
}

@objc func showCityList() {
    self.present(MyNextVC(), animated: true, completion: nil)
}

1
지연을 사용하는 대신 viewDidAppear 또는 viewDidLayoutSubviews에 코드를 넣습니다.
Pranav Kasetti

0

Break 설정을 잊었을 때이 문제가 발생했습니다. switch 문에서 뷰를 푸시 한 후!

여기처럼 :

case 1:{

        SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil];
        [self.navigationController pushViewController:someViewController animated:YES];
        [someViewController release];
    }

        break; //Forgetting to set break here:

0

"모양 전환을 시작 / 종료하기위한 불균형 호출"오류의 원인은 탐색 할 때 | 동시에 두 번 segue


0

한 가지 해결책은

[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];

0

로드가 완료되기 전에 UIViewController를 닫으려고하면이 문제가 발생할 수 있습니다.

콘솔에이 메시지가 있었고 성공하지 못한 채 새로운 UIViewController를 제공하는 UIViewController에 전적으로 집중하고있었습니다. 나는 마침내 사용자가 자신의 계정에 로그인하지 않았기 때문에 내가 제시 한 UIViewController에 문제가 있다는 것을 발견했습니다.

이것이 누군가를 돕기를 바랍니다.


0

이것은 나에게 힘든 일이었습니다. 나는 재정의했습니다.

override func shouldAutomaticallyForwardRotationMethods() -> Bool {
    return true
}

재정의하지 않고 :

override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
    return true
}

내 창 루트 탐색 컨트롤러에서. 그런 다음 위에서 언급 한 경고와 함께 다른 뷰 컨트롤러를 푸시 할 때 자식 탐색 컨트롤러가 불평했습니다. 경고는 최악이 아니었고 큰 문제는 자식 탐색 컨트롤러의 대리인이 더 이상 호출되지 않았다는 것입니다. 이상해.


0

제 경우에는 ' '메서드 내부 에서 가져 NSData왔습니다 .NSURLviewDidLoad

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