การใช้กระดานเรื่องราวนี้เป็นเรื่องง่ายมาก คุณเพียงลากการกระทำไปที่ "ออก" แต่ฉันจะโทรจากรหัสของฉันได้อย่างไร
การใช้กระดานเรื่องราวนี้เป็นเรื่องง่ายมาก คุณเพียงลากการกระทำไปที่ "ออก" แต่ฉันจะโทรจากรหัสของฉันได้อย่างไร
คำตอบ:
แทรกชื่อของ Segue เพื่อคลาย
จากนั้นให้- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
ระบุชื่อของคุณ
นี่คือคำตอบที่สมบูรณ์เกี่ยวกับ Objective C และ Swift:
1) สร้างส่วนIBAction
ต่อขยายที่ผ่อนคลายในตัวควบคุมมุมมองปลายทางของคุณ (ที่คุณต้องการทำต่อ) ทุกที่ในไฟล์การนำไปใช้งาน
// Objective C
- (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {
}
// Swift
@IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {
}
2) ในตัวควบคุมมุมมองแหล่งที่มา (ตัวควบคุมที่คุณแยกจาก), ⌃ + ลากจาก "ชื่อกิจกรรม" เพื่อออก คุณควรเห็นชุดคลายเครียดที่สร้างขึ้นในขั้นตอนที่ 1 ในป๊อปอัพ (หากคุณไม่เห็นให้อ่านขั้นตอนที่หนึ่ง) เลือก relaxToContainerVC: จากป๊อปอัปหรือสิ่งที่คุณตั้งชื่อวิธีการเชื่อมต่อตัวควบคุมแหล่งที่มาของคุณกับ IBAction ผ่อนคลาย
3) เลือกทำต่อในโครงร่างเอกสารมุมมองควบคุมแหล่งที่มาของสตอรี่บอร์ด (มันจะแสดงอยู่ด้านล่าง) และให้มันระบุ
4) เรียกเซกชั่นคลายโดยใช้วิธีนี้จากคอนโทรลเลอร์มุมมองแหล่งที่มาแทนที่ชื่อเซสชั่นคลายของคุณ
// วัตถุประสงค์ C
[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];
// Swift
self.performSegueWithIdentifier("unwindToContainerVC", sender: self)
NB ใช้คุณสมบัติ sourceViewController ของพารามิเตอร์ segue บนวิธีคลายเพื่อเข้าถึงคุณสมบัติที่เปิดเผยใด ๆ บนตัวควบคุมแหล่งที่มา นอกจากนี้ให้สังเกตว่าเฟรมเวิร์กจัดการยกเลิกการควบคุมคอนโทรลเลอร์ หากคุณต้องการยืนยันวิธีการนี้ให้เพิ่มวิธีการ dealloc ให้กับตัวควบคุมแหล่งที่มาพร้อมกับข้อความบันทึกที่ควรเริ่มทำงานเมื่อมันถูกฆ่า หาก dealloc ไม่ทำงานคุณอาจมีรอบการกักกัน
(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
ctrl+drag
จากเป็นViewController
ถึงExit
มีประโยชน์อย่างเหลือเชื่อ ขอบคุณ!
bradleygriffith
คำตอบที่ดีมาก ฉันใช้ขั้นตอนที่ 10 และสร้างภาพหน้าจอเพื่อทำให้เข้าใจง่าย นี่คือภาพหน้าจอใน Xcode 6
unwind segue
ในแถบด้านข้าง:[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
UIViewController
แรกของทุกวิธีการในการคลี่คลายต้องรวมอยู่ภายใน จากนั้นโซลูชันของคุณจะทำงาน
ผมใช้ซึ่งจะกลับมาให้คุณโทร[self dismissViewControllerAnimated: YES completion: nil];
ViewController
การอ้างอิงข้อความจากโน้ตด้านเทคนิคของ Apple ใน Unwind Segue: หากต้องการเพิ่มส่วนคลายที่จะถูกเรียกใช้โดยทางโปรแกรมให้ควบคุม + ลากจากไอคอนตัวควบคุมมุมมองของฉากไปที่ไอคอนทางออกจากนั้นเลือกการดำเนินการผ่อนคลายสำหรับส่วนต่อใหม่จากเมนูป๊อปอัป
คำตอบของ Vishal Chaudhry ทำงานได้สำหรับฉัน ฉันจะเพิ่มที่เพื่อทริกเกอร์ seque ด้วยตนเองโดยใช้:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
จากภายใน ViewController คุณต้องเลือกซีเควสคลายภายใต้ฉากของ ViewController ในกระดานเรื่องราวและในมุมมองคุณสมบัติบน RHS ให้แน่ใจว่าฟิลด์ Indentifier มี namer ที่คุณอ้างถึงในรหัส ("mySegueName" ในตัวอย่างด้านบน )
หากคุณข้ามขั้นตอนนี้ไปบรรทัดข้างต้นจะทำให้เกิดข้อยกเว้นที่ไม่ทราบชื่อ seque
โซลูชันที่เข้ากันได้ย้อนหลังที่จะทำงานกับเวอร์ชันก่อนหน้า ios6 สำหรับผู้ที่สนใจ:
- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {
for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
if ([vc isKindOfClass:vcClass]) {
[self.navigationController popToViewController:vc animated:animated];
return;
}
}
}
สวิฟท์ 4 :
1.สร้าง@IBActionด้วยส่วนควบคุมภายในที่คุณต้องการคลาย:
@IBAction func unwindToVC(segue: UIStoryboardSegue) {
}
2.ในกระดานเรื่องราวจากตัวควบคุมที่คุณต้องการแยก (คลาย) จาก ctrl + ลากจากเครื่องหมายควบคุมเพื่อออกจากระบบแล้วเลือกวิธีที่คุณสร้างไว้ก่อนหน้านี้:
3.ตอนนี้คุณสามารถสังเกตเห็นว่าในเอกสารเค้าร่างคุณมีบรรทัดใหม่ที่มีชื่อ "ผ่อนคลายต่อ .... " ตอนนี้คุณควรคลิกที่บรรทัดนี้และเปิดตัวตรวจสอบคุณลักษณะเพื่อตั้งค่าตัวระบุ (ในกรณีของฉันrelaxSegueIdentifier )
4.เกือบเสร็จแล้ว! ตอนนี้คุณต้องเปิดตัวควบคุมมุมมองที่คุณต้องการคลายและสร้างวิธีที่จะทำต่อ ตัวอย่างเช่นคุณสามารถเพิ่มปุ่มเชื่อมต่อกับรหัสด้วย@IBActionหลังจากนั้นในIBActionนี้ให้เพิ่มperfromSegue (withIdentifier: sender :) method:
@IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
}
นั่นคือทั้งหมดที่คุณต้องทำ!
สำหรับผู้ที่สงสัยว่าจะทำอย่างไรกับ VC ที่ไม่ได้ตั้งค่าผ่านกระดานเรื่องราว (ผู้ที่มาที่คำถามนี้จากการค้นหา "โดยทางโปรแกรม" + "คลายความยุ่งยาก")
เนื่องจากคุณไม่สามารถตั้งค่าเซกเมนต์ผ่อนคลายโดยใช้วิธีการแก้ปัญหาเชิงโปรแกรมที่ง่ายที่สุด แต่เพียงผู้เดียวคือการโทร:
navigationController?.popToRootViewController(animated: true)
ซึ่งจะปรากฏตัวควบคุมมุมมองทั้งหมดบนสแต็กกลับไปยังตัวควบคุมรูทมุมมองของคุณ
หากต้องการแสดงเฉพาะตัวควบคุมมุมมองสูงสุดจากการนำทางสแตกให้ใช้:
navigationController?.popViewController(animated: true)
FYI: ในการที่คำตอบของ @ Vadim จะทำงานร่วมกับการดำเนินการผ่อนคลายแบบแมนนวลที่เรียกจากภายใน View Controller คุณต้องวางคำสั่ง:
[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];
ภายในเมธอด class overriden viewDidAppear จะเป็นดังนี้:
-(void) viewDidAppear:(BOOL) animated
{
[super viewDidAppear: animated];
[self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}
หากคุณใส่ไว้ในวิธีการอื่นของ ViewController เช่นviewDidLoadหรือviewWillAppearมันจะถูกละเว้น
performSegueWithIdentfier
ทำสิ่งนั้นอย่างแน่นอน: ทำการส่งสัญญาณจาก ViewController หนึ่งไปยังอีกที่หนึ่ง