การเรียกที่ไม่สมดุลเพื่อเริ่มต้น / สิ้นสุดการเปลี่ยนลักษณะสำหรับ <FirstViewController: 0x2a2c00>


93

ฉันมีปัญหานี้เมื่อจำลองแอปไม่ใช่ข้อผิดพลาดหรือคำเตือน แต่ปรากฏในคอนโซลมีใครเคยประสบปัญหานี้มาก่อนหรือไม่


คุณสร้างแอนิเมชันบางประเภทในตัวควบคุมมุมมองนั้นหรือไม่

1
ใช่. ฉันมีภาพเคลื่อนไหวเริ่มต้นที่เลื่อนไปยังรูปภาพต่างๆตอนนี้ฉันสังเกตเห็นข้อผิดพลาดนี้เกิดขึ้นเมื่อฉันกำลังโหลดโค้ดลงในโทรศัพท์
C.Johns

ข้อความแสดงข้อผิดพลาดแนะนำให้คุณเริ่มการเปลี่ยนแปลง แต่ไม่มีสายที่ขาดหายไปไปยังวิธีการสิ้นสุดที่เกี่ยวข้อง

1
มีสิ่งเดียวกัน วิธีแก้ปัญหานี้หรือไม่?
seeafish

กำลังมองหาวิธีแก้ปัญหานี้ด้วย
barfoon

คำตอบ:


48

ในกรณีของฉันข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณคลิกสองแท็บใน tableview เร็วมาก

ผลลัพธ์ทำให้ชื่อเรื่องผิดปุ่มย้อนกลับหายไป set animated:NOมีคนพูดถึงว่าเมื่อคุณผลักดันมุมมอง ข้อผิดพลาดจะหายไป แต่ยังคงทำให้เกิดพฤติกรรมแปลก ๆ บางอย่าง มันดันสองมุมมองจากนั้นคุณต้องย้อนกลับสองครั้งเพื่อกลับหน้าจอ tableview

วิธีที่ฉันพยายามเพื่อแก้ไขปัญหานี้:

เพิ่ม BOOL cellSelected;

ใน viewWillAppear cellSelected = YES;

ในผู้แทนไม่ได้เลือกเซลล์ if (cellSelected){cellSelected = NO; do action ; }

ซึ่งจะช่วยป้องกันไม่ให้คลิกเซลล์สองเซลล์ที่แตกต่างกันอย่างรวดเร็ว


5
ฉันเดาว่าเป็นคำที่ยากที่จะเข้าใจ ฉันได้ทำการแก้ไขเล็กน้อยเพื่อเพิ่มความสามารถในการอ่าน
Kyle Clegg

42

ในกรณีของฉันมันเกิดขึ้นเมื่อฉันทริกเกอร์ [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];ภายในเมธอดUINavigationControllerของรายการviewDidLoad

การย้ายไปยังviewDidAppearวิธีการนี้ช่วยแก้ปัญหาได้

เหตุผลที่เป็นไปได้มากก็คือviewDidLoadไม่ใช่ว่าแอนิเมชั่นแฟนซีทั้งหมดได้เสร็จสิ้นลงแล้วในขณะที่viewDidAppearทุกอย่างเสร็จสิ้น


ขอบคุณ. ฉันหลงตัวเองในยุคมนุษย์ถ้ำที่ฉันสร้างรหัสองค์ประกอบ UI ทุกรายการ สตอรี่บอร์ดเป็นเรื่องใหม่สำหรับฉัน
Kiran Kulkarni


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:YESเป็น NO และแก้ไขปัญหาได้ เช่น.[self.navigationController pushViewController: viewController_Obj animated:NO];


7

ฉันมีปัญหาเดียวกันกับการใช้ตัวควบคุมการนำทางและผลักตัวควบคุมอื่นไปที่มัน ฉันพยายามใช้Buffered Navigation Controllerและวิธีอื่น ๆ อีกหลายวิธี แต่มันไม่ได้ผลสำหรับฉัน หลังจากใช้เวลาพอสมควรในการหาข้อมูลฉันสังเกตเห็นว่าปัญหานี้เกิดขึ้นหากคุณพยายามดันตัวควบคุมมุมมองใหม่ในขณะที่ธุรกรรมก่อนหน้า (ภาพเคลื่อนไหว) กำลังดำเนินการอยู่ (ฉันเดาว่าระยะเวลาประมาณ 0.5 วินาที) อย่างไรก็ตามฉันได้แก้ปัญหาอย่างรวดเร็วด้วยการมอบหมายตัวควบคุมการนำทางและรอให้ภาพเคลื่อนไหวก่อนหน้าเสร็จสิ้น


ขอขอบคุณ! การย้ายตรรกะของฉันไปที่ viewDidAppear ช่วยในสถานการณ์ของฉัน
Jaroslav

7

ตรวจสอบให้แน่ใจว่าคุณไม่ลืมใน -viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear เพื่อเรียก super method ที่เหมาะสมในการโอเวอร์โหลดของเมธอดนั้น ตัวอย่างเช่นในกรณีของฉันฉันไม่ตรงกันชื่อเมธอดเช่นนี้:

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

สังเกตว่าวิธีการปรากฏและหายไปไม่ตรงกัน


ใช้เวลาประมาณสองชั่วโมงในการแก้ไขปัญหานี้และนี่คือสิ่งที่เกิดขึ้น โทรsuper.viewWillAppear()ภายในviewDidDisappear().
Daniel Wood

ขอบคุณสำหรับเคล็ดลับนี้ ไม่ใช่ปัญหาเดียวของฉัน แต่มันช่วยได้!
Anthony C

4

'การโทรที่ไม่สมดุลเพื่อเริ่มต้น / สิ้นสุดการเปลี่ยนลักษณะสำหรับ'

กล่าวว่าแอนิเมชั่นเริ่มต้นก่อนที่ภาพเคลื่อนไหวที่เกี่ยวข้องจะไม่เสร็จสิ้น คุณกำลังเปิดตัวควบคุมมุมมองก่อนที่จะผลักดันตัวใหม่หรือไม่? หรืออาจจะโผล่ไปรูท? ถ้าใช่ลองทำโดยไม่มีภาพเคลื่อนไหวเช่น[self.navigationController popToRootViewControllerAnimated:NO];

และดูว่าวิธีนี้ช่วยแก้ปัญหาได้หรือไม่ในกรณีของฉันนี่เป็นเคล็ดลับ


1
นี่คือกุญแจสำคัญ: เปิดหรือเปลี่ยนการเปลี่ยนมุมมองคอนโทรลเลอร์อื่น ๆ ในเวลาเดียวกัน
Rocky

2

ฉันได้รับปัญหานี้เนื่องจากฉันกำลังเรียก UIPrintInteractionController จาก viewController ที่ไม่มี UITabbar และไม่มี UINavigationBar ดูเหมือนว่า UIPrintInteractionController ไม่ได้รับ printInteractionControllerParentViewController ที่ถูกต้อง การใช้เมธอดในผู้รับมอบสิทธิ์และส่งคืน rootViewController ปัจจุบันทำงานให้ฉัน

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

2

ฉันมีปัญหาคล้ายกันที่เกี่ยวข้องกับการย้อนกลับกล่องโต้ตอบโมดอล โพสต์วิธีแก้ปัญหาที่นี่ ...

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

[ปัญหา]

Nav Controller -> VC1 -Push -> VC2 -PopOver หรือ Modal Segue -> VC3

VC3 กำลังคลายกลับไปที่ VC1

เมื่อ Segue จาก VC2 เป็น VC3 เป็น PopOver และ Modal การคลายตัวจะสิ้นสุดลงในคำเตือน: การเรียกที่ไม่สมดุลเพื่อเริ่มต้น / สิ้นสุดการเปลี่ยนลักษณะสำหรับ UIViewController "

หากมีการผลัก Segue จาก VC ไปยัง VC คำเตือนจะหายไป

[วิธีการแก้]

มันจะดีมากถ้าตรรกะที่ผ่อนคลายจะดูแลสิ่งนี้ อาจจะเป็นบั๊กอาจจะไม่ใช่ ไม่ว่าจะด้วยวิธีใดวิธีแก้ปัญหาคือทำให้ 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];
}

โดยทั่วไปกล่าวว่าวงจรชีวิตของมุมมองไม่ได้รับการปรับปรุงสำหรับ viewControllers เหล่านั้นที่คุณพยายามแสดง


1

ฉันมีปัญหาที่คล้ายกันเมื่อพยายามทำ:

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

ในฟังก์ชันเช่น- (void) popUpToLevelTwo;และการใส่return;ท้ายฟังก์ชันช่วยแก้ปัญหาได้


1

ฉันยังได้รับสิ่งนี้ที่

[self dismissModalViewControllerAnimated:YES];

ฉันเปลี่ยนYESเป็น a NOและแก้ไขปัญหาได้


1

ฉันมีปัญหาเดียวกันเมื่อฉันใช้วิธีป๊อปของ navigationcontroller ในแอพของฉันฉันใช้ตรรกะแยกต่างหากสำหรับตัวควบคุมการนำทางดังนั้นหลีกเลี่ยงการใช้แถบนำทางและมันจะถูกซ่อนอยู่เสมอ จากนั้นฉันใช้มุมมองที่กำหนดเองและการแจ้งเตือนเพื่อจัดการปุ่มย้อนกลับและเป็นเหตุการณ์ ผู้สังเกตการณ์การแจ้งเตือนได้รับการลงทะเบียนและไม่ถูกลบออก ดังนั้นการแจ้งเตือนจึงเริ่มทำงานสองครั้งและสร้างข้อผิดพลาดดังกล่าวข้างต้น ตรวจสอบรหัสของคุณอย่างละเอียดเพื่อรับข้อผิดพลาดดังกล่าว


1

สำหรับสิ่งที่คุ้มค่าฉันได้รับข้อผิดพลาดเดียวกันนี้เมื่อไม่รวมสายเรียกเข้า[super viewDidLoad:animated]ในการviewDidLoadแทนที่ของฉัน


1
คุณอาจหมายถึง viewDidAppear? viewDidLoad ไม่มีพารามิเตอร์
Fabio Napodano

1

ฉันมีปัญหานี้เช่นกันเมื่อฉันแตะปุ่มจาก NIB ปรากฎว่าฉันต่อปุ่มโดยไม่ได้ตั้งใจเพื่อส่งเหตุการณ์ไปยังวิธี IBAction สองวิธีซึ่งแต่ละวิธีทำ pushViewController: animated:


ขอบคุณ !! คุณประหยัดเวลาของฉัน !!
VD

1

ฉันมีตรรกะบางอย่างที่ใช้เพื่อรอการผลักดันUIViewControllerจนกว่าข้อมูลทั้งหมดจะถูกดาวน์โหลด มีข้อผิดพลาดในตรรกะนี้ซึ่งทำให้พุชUIViewControllerเร็วเกินไปในขณะที่ยังมีการเรียก API อื่นอยู่

มันทำให้สิ่งเดียวกันUIViewControllerถูกผลักสองครั้งโดยUINavigationControllerและให้คำเตือนนี้


1

เหตุผลในการส่งข้อความ:ข้อความนี้ได้รับการแสดงถ้าหากคุณกำลังผลักดัน / นำเสนออีกมุมมองควบคุมจากviewWillAppear, loadView, initหรือviewDidLoadวิธีการในการควบคุมปัจจุบันดู

วิธีลบข้อความแสดงข้อผิดพลาด:ย้ายรหัสการส่ง / นำเสนอไปที่viewDidAppearวิธีการจะช่วยแก้ปัญหาได้


1

สวิฟต์ 4

ปัญหาของฉันคือฉันกำลังนำเสนอ VC อื่นก่อนที่จะแสดง 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)
}

4
แทนที่จะใช้ความล่าช้าฉันจะใส่รหัสใน viewDidAppear หรือ viewDidLayoutSubviews
Pranav Kasetti

0

ฉันมีปัญหานี้เมื่อฉันลืมตั้งค่า 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:

0

สาเหตุเบื้องหลังข้อผิดพลาด "การเรียกที่ไม่สมดุลเพื่อเริ่มต้น / สิ้นสุดการเปลี่ยนรูปลักษณ์" คือเมื่อคุณนำทาง | ทำตามสองครั้งในเวลาเดียวกัน



0

คุณสามารถเรียกใช้สิ่งนี้ได้หากคุณพยายามปิด UIViewController ก่อนที่จะโหลดเสร็จ

ฉันมีข้อความนี้ในคอนโซลและมุ่งเน้นไปที่ UIViewController ที่นำเสนอ UIViewController ใหม่โดยไม่ประสบความสำเร็จ ในที่สุดฉันก็พบว่าปัญหาอยู่ใน UIViewController ที่ฉันนำเสนอกำลังปิดตัวเองเนื่องจากผู้ใช้ไม่ได้ลงชื่อเข้าใช้บัญชีของพวกเขา

หวังว่านี่จะช่วยใครบางคนได้


0

นี่เป็นเรื่องที่ยากสำหรับฉัน: ฉันได้ลบล้างไปแล้ว

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

โดยไม่ลบล้าง:

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

ในตัวควบคุมการนำทางรูทหน้าต่างของฉัน จากนั้นตัวควบคุมการนำทางเด็กบ่นเมื่อกดตัวควบคุมมุมมองอื่นพร้อมคำเตือนดังกล่าวข้างต้น คำเตือนไม่ใช่สิ่งที่เลวร้ายที่สุดปัญหาใหญ่คือไม่มีการเรียกตัวแทนของตัวควบคุมการนำทางเด็กอีกต่อไป เหนื่อย


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.