ฉันมีปัญหานี้เมื่อจำลองแอปไม่ใช่ข้อผิดพลาดหรือคำเตือน แต่ปรากฏในคอนโซลมีใครเคยประสบปัญหานี้มาก่อนหรือไม่
ฉันมีปัญหานี้เมื่อจำลองแอปไม่ใช่ข้อผิดพลาดหรือคำเตือน แต่ปรากฏในคอนโซลมีใครเคยประสบปัญหานี้มาก่อนหรือไม่
คำตอบ:
ในกรณีของฉันข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณคลิกสองแท็บใน tableview เร็วมาก
ผลลัพธ์ทำให้ชื่อเรื่องผิดปุ่มย้อนกลับหายไป set animated:NO
มีคนพูดถึงว่าเมื่อคุณผลักดันมุมมอง ข้อผิดพลาดจะหายไป แต่ยังคงทำให้เกิดพฤติกรรมแปลก ๆ บางอย่าง มันดันสองมุมมองจากนั้นคุณต้องย้อนกลับสองครั้งเพื่อกลับหน้าจอ tableview
วิธีที่ฉันพยายามเพื่อแก้ไขปัญหานี้:
เพิ่ม BOOL cellSelected;
ใน viewWillAppear
cellSelected = YES;
ในผู้แทนไม่ได้เลือกเซลล์ if (cellSelected){cellSelected = NO; do action ; }
ซึ่งจะช่วยป้องกันไม่ให้คลิกเซลล์สองเซลล์ที่แตกต่างกันอย่างรวดเร็ว
ในกรณีของฉันมันเกิดขึ้นเมื่อฉันทริกเกอร์ [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];
ภายในเมธอดUINavigationController
ของรายการviewDidLoad
การย้ายไปยังviewDidAppear
วิธีการนี้ช่วยแก้ปัญหาได้
เหตุผลที่เป็นไปได้มากก็คือviewDidLoad
ไม่ใช่ว่าแอนิเมชั่นแฟนซีทั้งหมดได้เสร็จสิ้นลงแล้วในขณะที่viewDidAppear
ทุกอย่างเสร็จสิ้น
ฉันมีปัญหานี้เหมือนกัน ฉันพบสองวิธีแก้ปัญหานี้:
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];
});
dispatch_async
ในคิวหลัก สิ่งที่เกี่ยวกับdispatch_async
คือมันจะรอจนกว่าภาพเคลื่อนไหวอื่น ๆ ทั้งหมดในคิวหลักจะเสร็จสิ้น มันดีกว่าการใช้การหน่วงเวลามากเพราะ: 1- คุณจะไม่มีทางรู้เลยว่าความล่าช้าเพียงพอหรือไม่ขึ้นอยู่กับอุปกรณ์โฮสต์ของคุณ 2- คุณจะต้องใช้ความล่าช้ามากเกินไปและบางสิ่งจะล่าช้า ลองสิ่งนี้:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
ฉันมีปัญหามากมายกับปัญหาเดียวกัน ฉันแก้ปัญหานี้โดยวิธีนี้
1) คุณไม่ได้ใช้กำหนดค่าเริ่มต้นUIViewController's
ลองใช้มันแทนเพียงinitWithNibName:bundle:
init
2) ตั้งค่าanimated:YES
เป็น NO และแก้ไขปัญหาได้ เช่น.[self.navigationController pushViewController: viewController_Obj animated:NO];
ฉันมีปัญหาเดียวกันกับการใช้ตัวควบคุมการนำทางและผลักตัวควบคุมอื่นไปที่มัน ฉันพยายามใช้Buffered Navigation Controllerและวิธีอื่น ๆ อีกหลายวิธี แต่มันไม่ได้ผลสำหรับฉัน หลังจากใช้เวลาพอสมควรในการหาข้อมูลฉันสังเกตเห็นว่าปัญหานี้เกิดขึ้นหากคุณพยายามดันตัวควบคุมมุมมองใหม่ในขณะที่ธุรกรรมก่อนหน้า (ภาพเคลื่อนไหว) กำลังดำเนินการอยู่ (ฉันเดาว่าระยะเวลาประมาณ 0.5 วินาที) อย่างไรก็ตามฉันได้แก้ปัญหาอย่างรวดเร็วด้วยการมอบหมายตัวควบคุมการนำทางและรอให้ภาพเคลื่อนไหวก่อนหน้าเสร็จสิ้น
ตรวจสอบให้แน่ใจว่าคุณไม่ลืมใน -viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear เพื่อเรียก super method ที่เหมาะสมในการโอเวอร์โหลดของเมธอดนั้น ตัวอย่างเช่นในกรณีของฉันฉันไม่ตรงกันชื่อเมธอดเช่นนี้:
-(void)viewDidAppear
{
[super viewDidDisappear];
//some code staff
..
}
สังเกตว่าวิธีการปรากฏและหายไปไม่ตรงกัน
super.viewWillAppear()
ภายในviewDidDisappear()
.
'การโทรที่ไม่สมดุลเพื่อเริ่มต้น / สิ้นสุดการเปลี่ยนลักษณะสำหรับ'
กล่าวว่าแอนิเมชั่นเริ่มต้นก่อนที่ภาพเคลื่อนไหวที่เกี่ยวข้องจะไม่เสร็จสิ้น คุณกำลังเปิดตัวควบคุมมุมมองก่อนที่จะผลักดันตัวใหม่หรือไม่? หรืออาจจะโผล่ไปรูท? ถ้าใช่ลองทำโดยไม่มีภาพเคลื่อนไหวเช่น[self.navigationController popToRootViewControllerAnimated:NO];
และดูว่าวิธีนี้ช่วยแก้ปัญหาได้หรือไม่ในกรณีของฉันนี่เป็นเคล็ดลับ
ฉันได้รับปัญหานี้เนื่องจากฉันกำลังเรียก UIPrintInteractionController จาก viewController ที่ไม่มี UITabbar และไม่มี UINavigationBar ดูเหมือนว่า UIPrintInteractionController ไม่ได้รับ printInteractionControllerParentViewController ที่ถูกต้อง การใช้เมธอดในผู้รับมอบสิทธิ์และส่งคืน rootViewController ปัจจุบันทำงานให้ฉัน
- (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;
ฉันมีปัญหาคล้ายกันที่เกี่ยวข้องกับการย้อนกลับกล่องโต้ตอบโมดอล โพสต์วิธีแก้ปัญหาที่นี่ ...
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)
}
}
}
สถานการณ์อาจเกิดขึ้นได้หากคุณกำลังเพิ่มมุมมองด้วยตัวควบคุมมุมมองโมดอลเป็นมุมมองย่อย น่าใช้ที่สุด:
-(void) viewDidAppear:(BOOL)animated {
[self presentViewController:self.yourModalVC animated:YES completion:nil];
}
โดยทั่วไปกล่าวว่าวงจรชีวิตของมุมมองไม่ได้รับการปรับปรุงสำหรับ viewControllers เหล่านั้นที่คุณพยายามแสดง
ฉันมีปัญหาที่คล้ายกันเมื่อพยายามทำ:
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];
ในฟังก์ชันเช่น- (void) popUpToLevelTwo;
และการใส่return;
ท้ายฟังก์ชันช่วยแก้ปัญหาได้
ฉันยังได้รับสิ่งนี้ที่
[self dismissModalViewControllerAnimated:YES];
ฉันเปลี่ยนYES
เป็น a NO
และแก้ไขปัญหาได้
ฉันมีปัญหาเดียวกันเมื่อฉันใช้วิธีป๊อปของ navigationcontroller ในแอพของฉันฉันใช้ตรรกะแยกต่างหากสำหรับตัวควบคุมการนำทางดังนั้นหลีกเลี่ยงการใช้แถบนำทางและมันจะถูกซ่อนอยู่เสมอ จากนั้นฉันใช้มุมมองที่กำหนดเองและการแจ้งเตือนเพื่อจัดการปุ่มย้อนกลับและเป็นเหตุการณ์ ผู้สังเกตการณ์การแจ้งเตือนได้รับการลงทะเบียนและไม่ถูกลบออก ดังนั้นการแจ้งเตือนจึงเริ่มทำงานสองครั้งและสร้างข้อผิดพลาดดังกล่าวข้างต้น ตรวจสอบรหัสของคุณอย่างละเอียดเพื่อรับข้อผิดพลาดดังกล่าว
สำหรับสิ่งที่คุ้มค่าฉันได้รับข้อผิดพลาดเดียวกันนี้เมื่อไม่รวมสายเรียกเข้า[super viewDidLoad:animated]
ในการviewDidLoad
แทนที่ของฉัน
ฉันมีปัญหานี้เช่นกันเมื่อฉันแตะปุ่มจาก NIB ปรากฎว่าฉันต่อปุ่มโดยไม่ได้ตั้งใจเพื่อส่งเหตุการณ์ไปยังวิธี IBAction สองวิธีซึ่งแต่ละวิธีทำ pushViewController: animated:
ฉันมีตรรกะบางอย่างที่ใช้เพื่อรอการผลักดันUIViewController
จนกว่าข้อมูลทั้งหมดจะถูกดาวน์โหลด มีข้อผิดพลาดในตรรกะนี้ซึ่งทำให้พุชUIViewController
เร็วเกินไปในขณะที่ยังมีการเรียก API อื่นอยู่
มันทำให้สิ่งเดียวกันUIViewController
ถูกผลักสองครั้งโดยUINavigationController
และให้คำเตือนนี้
เหตุผลในการส่งข้อความ:ข้อความนี้ได้รับการแสดงถ้าหากคุณกำลังผลักดัน / นำเสนออีกมุมมองควบคุมจากviewWillAppear
, loadView
, init
หรือviewDidLoad
วิธีการในการควบคุมปัจจุบันดู
วิธีลบข้อความแสดงข้อผิดพลาด:ย้ายรหัสการส่ง / นำเสนอไปที่viewDidAppear
วิธีการจะช่วยแก้ปัญหาได้
สวิฟต์ 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)
}
ฉันมีปัญหานี้เมื่อฉันลืมตั้งค่า 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:
สาเหตุเบื้องหลังข้อผิดพลาด "การเรียกที่ไม่สมดุลเพื่อเริ่มต้น / สิ้นสุดการเปลี่ยนรูปลักษณ์" คือเมื่อคุณนำทาง | ทำตามสองครั้งในเวลาเดียวกัน
ทางออกหนึ่งคือ
[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 ใหม่โดยไม่ประสบความสำเร็จ ในที่สุดฉันก็พบว่าปัญหาอยู่ใน UIViewController ที่ฉันนำเสนอกำลังปิดตัวเองเนื่องจากผู้ใช้ไม่ได้ลงชื่อเข้าใช้บัญชีของพวกเขา
หวังว่านี่จะช่วยใครบางคนได้
นี่เป็นเรื่องที่ยากสำหรับฉัน: ฉันได้ลบล้างไปแล้ว
override func shouldAutomaticallyForwardRotationMethods() -> Bool {
return true
}
โดยไม่ลบล้าง:
override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
return true
}
ในตัวควบคุมการนำทางรูทหน้าต่างของฉัน จากนั้นตัวควบคุมการนำทางเด็กบ่นเมื่อกดตัวควบคุมมุมมองอื่นพร้อมคำเตือนดังกล่าวข้างต้น คำเตือนไม่ใช่สิ่งที่เลวร้ายที่สุดปัญหาใหญ่คือไม่มีการเรียกตัวแทนของตัวควบคุมการนำทางเด็กอีกต่อไป เหนื่อย
ในกรณีของฉันฉันดึงเมธอดNSData
จากNSURL
ข้างใน ' viewDidLoad
'