programing

모양 전환 시작/종료에 대한 불균형 호출

cafebook 2023. 8. 16. 22:36
반응형

모양 전환 시작/종료에 대한 불균형 호출

앱을 시뮬레이션할 때 오류나 경고가 아니라 콘솔에 표시되는 문제가 있습니다. 이전에 이런 일을 겪은 적이 있는 사람이 있습니까?

이 오류는 테이블 보기에서 두 탭을 매우 빠르게 클릭할 때 발생합니다.

결과로 인해 잘못된 제목 이름이 발생합니다. 뒤로 단추가 사라집니다.뷰를 어떤사람당어견밀때나갈고해를떤신이이,set animated:NO오류는 사라지지만 여전히 이상한 동작이 발생합니다.두 개의 보기를 누른 다음 테이블 보기 화면을 다시 보려면 두 번 뒤로 이동해야 합니다.

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

더하다BOOL cellSelected;

viewWillAppear cellSelected = YES;

셀 이 셀대자를 했습니다.if (cellSelected){cellSelected = NO; do action ; }

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

저 같은 경우에는 제가 트리거되는 순간에[self performSegueWithIdentifier:@"SomeIdentifier" sender:self];에.UINavigationController품의목viewDidLoad방법.

데이터를 데이터 센터로 이동viewDidAppear방법은 문제를 해결했습니다.

그 이유는 매우 가능성이 높기 때문입니다.viewDidLoad모든 화려한 애니메이션이 이미 끝난 것은 아니지만, 반면에.viewDidAppear모든 것이 끝났습니다.

저도 이런 문제가 있어요.저는 이 문제에 대한 두 가지 해결책을 찾았습니다.

  1. 위에서 이 솔루션을 볼 수 있습니다.
  2. 는 하위클래찾다니았습에서 를 찾았습니다.UINavigationController이 문제가 해결된 곳입니다.버퍼링된 내비게이션 컨트롤러

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

 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];
        });

저는 같은 문제로 많은 문제를 겪었습니다.나는 이 방법으로 이것을 해결했습니다.

은 지않다니습하사용을 하지 않습니다.UIViewController's initWithNibName:bundle:그냥 사용하지 말고 사용해 보세요.init.

animated:YES아니요, 그것이 문제를 해결했습니다.예를 들면[self.navigationController pushViewController: viewController_Obj animated:NO];

내비게이션 컨트롤러를 사용하고 다른 컨트롤러를 사용하여 동일한 문제가 발생했습니다.나는 버퍼링된 내비게이션 컨트롤러와 다른 몇 가지 방법을 사용하려고 했지만 잘 되지 않았습니다.시간을 들여 확인한 결과 이전 트랜잭션(애니메이션)이 진행 중인 동안 새 뷰 컨트롤러를 푸시하려고 하면 이 문제가 발생한다는 것을 알게 되었습니다(약 0.5초 지속).어쨌든, 나는 내비게이션 컨트롤러를 위임하고 이전 애니메이션이 끝나기를 기다리며 빠른 해결을 했습니다.

willDisparen, -viewDidDisparen, -viewDidLoad, -viewWillDisparen, -viewDidDisparen은 해당 메서드를 오버로드할 때 적절한 super 메서드를 호출하는 것을 잊지 않도록 합니다.예를 들어 다음과 같이 메서드 이름이 일치하지 않습니다.

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

나타나는 방법과 사라지는 방법이 일치하지 않음을 알리는 알림

'에 대한 모양 전환 시작/종료 호출이 불균형합니다.'

마지막 관련 애니메이션이 완료되기 전에 애니메이션이 시작된다고 말합니다.그러면 새 컨트롤러를 누르기 전에 뷰 컨트롤러를 터뜨리시겠습니까? 아니면 뿌리로 터뜨릴 수도 있습니다. 만약 그렇다면 애니메이션을 사용하지 않는 것이 좋습니다.[self.navigationController popToRootViewControllerAnimated:NO];

그리고 이것이 문제를 해결하는지 보세요. 제 경우에는 이것이 효과가 있었습니다.

모달 대화상자를 되감는 것과 관련된 비슷한 문제가 있었습니다.솔루션을 여기에 게시했습니다.

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

[문제]

Nav Controller -> 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)
        }
    }
}

이 문제가 발생한 이유는 UIT 탭 모음이 없는 보기 컨트롤러에서 UIPrintInteractionController를 호출하고 UINavigationBar를 호출하지 않았기 때문입니다.UIPrintInteractionController가 올바른 인쇄를 받지 못한 것 같습니다.상호 작용 컨트롤러 상위 보기 컨트롤러입니다.대리자에서 메소드를 구현하고 현재 rootViewController를 반환하는 것이 제게 도움이 되었습니다.

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

스위프트 4

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

해결책은 빠른 지연 끝에 다음 VC를 발표하는 것이었습니다.

하지 말아야 할 것

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)
}

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

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

기본적으로 표시하려는 뷰 컨트롤러에 대해 뷰 수명 주기가 간소화되지 않습니다.

다음과 같은 작업을 시도할 때 비슷한 문제가 발생합니다.

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

와 같은 기능으로- (void) popUpToLevelTwo;그리고 말입니다.return;기능의 끝에서 문제를 해결합니다.

저도 이거 받았어요.

[self dismissModalViewControllerAnimated:YES];

변경했습니다.YES아주NO그리고 그것이 문제를 해결했습니다.

내비게이션 컨트롤러의 팝업 방식을 사용했을 때도 동일한 문제가 발생합니다. 앱에서 내비게이션 컨트롤러에 대해 별도의 로직을 사용합니다. 그래서 내비게이션 바를 사용하지 않고 항상 숨겨집니다.그런 다음 사용자 지정 보기 및 알림을 사용하여 뒤로 단추와 이벤트를 처리합니다.알림 관찰자는 등록되고 제거되지 않습니다.따라서 알림이 두 번 실행되고 위에서 언급한 오류가 발생합니다.코드를 철저히 확인하여 이러한 오류를 확인합니다.

전화를 포함하지 않은 경우에도 동일한 오류가 발생했습니다.[super viewDidLoad:animated]내 안에서viewDidLoad오버라이드

NIB에서 버튼을 눌렀을 때도 이런 문제가 있었습니다.제가 실수로 두 개의 IBAction 메서드에 이벤트를 보내기 위해 버튼을 배선한 것으로 드러났습니다. 각 메서드는 pushViewController: animated:

나는 몇 가지 논리를 구현하여 그것을 밀기를 기다렸습니다.UIViewController모든 데이터가 다운로드될 때까지.이 논리에 오류가 있어 다음을 수행할 수 있습니다.UIViewController아직 진행 중인 다른 API 호출이 있는 동안에는 너무 이른 시간입니다.

그것은 같은 원인이 되었습니다.UIViewController에 의해 두 번이나 밀림UINavigationController그리고 이 경고를 했습니다.

메시지 이유:이 메시지는 다른 View 컨트롤러를 푸시/프레젠테이션하는 경우에만 표시됩니다.viewWillAppear,loadView,init또는viewDidLoad현재 View 컨트롤러의 방법

오류 메시지를 제거하는 방법:푸시/프레젠테이션 코드 이동 위치viewDidAppear방법은 그 문제를 해결할 것입니다.

스위치 문에서 보기를 누른 후 Break을 설정하는 것을 잊어버렸을 때 이 문제가 발생했습니다.

예:

case 1:{

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

        break; //Forgetting to set break here:

"모양 전환 시작/종료에 대한 불균형 호출" 오류 뒤에 있는 이유는 | segue를 동시에 두 번 탐색할 때입니다.

한 가지 해결책은,

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

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

콘솔에 이 메시지를 표시하고 새로운 UIViewController를 제시하는 UIViewController에 전적으로 집중했지만 성공하지 못했습니다.제가 제시한 UIView 컨트롤러에서 사용자가 자신의 계정에 로그인하지 않았기 때문에 문제가 발생했습니다.

이것이 누군가에게 도움이 되기를 바랍니다.

이것은 저에게 힘든 일이었습니다. 저는 무시했습니다.

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

재정의하지 않음:

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

창 루트 탐색 컨트롤러에 있습니다.위에서 언급한 경고와 함께 다른 뷰 컨트롤러를 밀 때 하위 내비게이션 컨트롤러가 불만을 제기했습니다.그 경고는 최악이 아니었습니다. 큰 문제는 어린이 내비게이션 컨트롤러의 대표가 더 이상 호출되지 않았다는 것입니다.닳은

저 같은 경우엔 제가 가지고 온 것이NSDataNSURLviewDidLoad 법방

언급URL : https://stackoverflow.com/questions/6809593/unbalanced-calls-to-begin-end-appearance-transitions-for-firstviewcontroller-0

반응형