วิธีใหม่คือ:
[self dismissViewControllerAnimated:NO completion:nil];
คำกิริยาถูกลบออก ตามที่เคยเป็นมาสำหรับการเรียก API ที่นำเสนอ:
[self presentViewController:vc animated:NO completion:nil];
เหตุผลถูกกล่าวถึงในเซสชัน WWDC 236 ปี 2555 - วิวัฒนาการของ View Controllers บนวิดีโอiOS โดยพื้นฐานแล้วตัวควบคุมมุมมองที่นำเสนอโดย API นี้ไม่ได้เป็นโมดอลเสมอไปและเนื่องจากพวกเขากำลังเพิ่มตัวจัดการที่สมบูรณ์จึงเป็นช่วงเวลาที่ดีที่จะเปลี่ยนชื่อ
ในการตอบกลับความคิดเห็นจาก Marc:
วิธีใดดีที่สุดในการรองรับอุปกรณ์ 4.3 ขึ้นไป วิธีใหม่นี้ใช้ไม่ได้ใน iOS4 แต่วิธีการเดิมเลิกใช้แล้วใน iOS6
ฉันรู้ว่านี่เป็นคำถามที่แยกจากกัน แต่ฉันคิดว่ามันคุ้มค่าที่จะกล่าวถึงเนื่องจากไม่ใช่ทุกคนที่มีเงินในการอัพเกรดอุปกรณ์ทั้งหมดทุกๆ 3 ปีดังนั้นพวกเราหลายคนจึงมีอุปกรณ์รุ่นเก่า (ก่อน 5.0) ถึงกระนั้นเท่าที่ฉันเจ็บปวดที่จะพูดคุณต้องพิจารณาว่าควรกำหนดเป้าหมายที่ต่ำกว่า 5.0 หรือไม่ มี API ใหม่และเจ๋ง ๆ มากมายที่ไม่พร้อมใช้งานต่ำกว่า 5.0 และ Apple ทำให้การกำหนดเป้าหมายยากขึ้นอย่างต่อเนื่อง การสนับสนุน armv6 หลุดจาก Xcode 4.5 เช่น
หากต้องการกำหนดเป้าหมายให้ต่ำกว่า 5.0 (ตราบใดที่บล็อกการทำให้เสร็จสมบูรณ์เป็นศูนย์) เพียงแค่ใช้วิธีที่มีประโยชน์respondsToSelector
:
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
ในการตอบกลับความคิดเห็นอื่นจาก Marc:
นั่นอาจเป็นคำสั่ง If จำนวนมากในแอปพลิเคชันของฉัน! ... ฉันกำลังคิดที่จะสร้างหมวดหมู่ที่ห่อหุ้มรหัสนี้จะสร้างหมวดหมู่บน UIViewControler ทำให้ฉันถูกปฏิเสธหรือไม่
และอีกหนึ่งจาก Full Decent:
... มีวิธีทำให้ไม่แสดงคำเตือนคอมไพเลอร์ด้วยตนเองหรือไม่?
ประการแรกไม่สร้างหมวดหมู่บน UIViewController
ในและของตัวเองจะไม่ทำให้แอปของคุณถูกปฏิเสธ เว้นแต่วิธีการหมวดหมู่นั้นเรียกว่า API ส่วนตัวหรือสิ่งที่คล้ายกัน
วิธีการหมวดหมู่เป็นสถานที่ที่ดีมากสำหรับรหัสดังกล่าว นอกจากนี้เนื่องจากจะมีการเรียก API ที่เลิกใช้งานเพียงครั้งเดียวจึงมีคำเตือนคอมไพเลอร์เพียงรายการเดียว
เพื่อจัดการกับความคิดเห็น (คำถาม) ของ Full Decent ใช่คุณสามารถระงับคำเตือนของคอมไพเลอร์ได้ด้วยตนเอง นี่คือลิงค์ไปยังคำตอบของ SO ในเรื่องนั้น ๆๆ วิธีการจัดหมวดหมู่ยังเป็นจุดที่ดีเยี่ยมในการระงับคำเตือนของคอมไพเลอร์เนื่องจากคุณจะระงับคำเตือนไว้ที่เดียวเท่านั้น แน่นอนคุณไม่ต้องการที่จะปิดเสียงคอมไพเลอร์จำใจ
ถ้าฉันจะเขียนวิธีการหมวดหมู่ง่ายๆสำหรับสิ่งนี้อาจเป็นดังนี้:
@implementation UIViewController (NJ_ModalPresentation)
-(void)nj_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion{
NSAssert(completion == nil, @"You called %@ with a non-nil completion. Don't do that!",NSStringFromSelector(_cmd));
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:viewControllerToPresent animated:flag completion:completion];
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[self presentModalViewController:viewControllerToPresent animated:flag];
#pragma clang diagnostic pop
}
}
@end