ดำเนินการ Segue โดยทางโปรแกรมและส่งพารามิเตอร์ไปยังมุมมองปลายทาง


174

ในแอพของฉันฉันมีปุ่มที่ทำงานเป็นส่วนย่อยแบบเป็นโปรแกรม:

- (void)myButtonMethod
{
    //execute segue programmatically
    [self performSegueWithIdentifier: @"MySegue" sender: self];
}

ฉันต้องการทราบว่ามีวิธีการอ้างอิงมุมมองปลายทางและส่งผ่านพารามิเตอร์บางอย่างหรือไม่

ฉันรู้ว่าในprepareForSegueวิธีการฉันสามารถอ้างถึงด้วย: myDestinationViewController *vc = [segue destinationViewController];แต่ฉันไม่ทราบวิธีการดำเนินการในส่วนย่อยทางโปรแกรม

คุณมีความคิดใด ๆ

ขอบคุณ yassa


UPDATE:

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


44
เพิ่มการอัปเดตเป็นคำตอบและยอมรับเพื่อให้คนรู้ว่าคำตอบนี้ได้รับการตอบแล้ว :)
danielbeard

เพิ่มคำตอบแสดงความคิดเห็นเพื่อการแจ้งเตือน
DanSkeel

11
คุณควรทำเครื่องหมายคำตอบด้านล่างว่าถูกต้องเพื่อให้คนอื่นรู้ว่าได้รับคำตอบแล้ว
lindon fox

คำตอบ:


107

คำตอบก็คือมันไม่ได้ทำให้ความแตกต่างในการเรียกใช้งาน

prepareForSegue:sender:วิธีการที่เรียกว่าในกรณีใด ๆ และนี่คือที่ที่คุณผ่านพารามิเตอร์ของคุณทั่ว


3
สิ่งนี้ยังทำให้ฉันรำคาญใจ - นี่หมายความว่าฉันต้องเรียกใช้ segue ในที่เดียวซึ่งฉันมีข้อมูลที่ฉันต้องการส่งเป็นพารามิเตอร์ที่แยกได้อย่างชัดเจนจากสิ่งอื่น แต่เพื่อเพิ่มข้อมูลนั้นในสถานที่ที่แตกต่างกันโดยสิ้นเชิง - ไม่รู้อะไรเกี่ยวกับข้อมูลที่ต้องส่ง ความหมายฉันต้องสร้างรัฐด้วยข้อมูลที่เป็นปัญหาในบริบทที่ใช้งานร่วมกันโดยสองฟังก์ชั่นที่แตกต่างกัน ฉันไม่ต้องการสกปรกสถานะเมื่อทั้งหมดที่ฉันต้องการคือการเปิดมุมมองใหม่ด้วยข้อมูลบางอย่าง ...
NeverwinterMoon

ใช้ผู้ส่งเพื่อผ่านบริบทที่จำเป็นในการกำหนดค่า VC ปลายทาง
ดักจับ

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

จากเอกสารอย่างเป็นทางการเกี่ยวกับผู้ส่ง: "วัตถุนี้มีให้เพื่อวัตถุประสงค์ในการให้ข้อมูลในระหว่างการดำเนินการจริง"
NeverwinterMoon

1
ใช่ไม่ผ่านส่วนของข้อมูลจริงผ่านบริบทเช่นเซลล์ / ปุ่ม / ดัชนี / ฯลฯ ที่เรียกส่วนย่อย
ดักสัตว์

90

คำถามเก่า แต่นี่คือรหัสเกี่ยวกับวิธีการทำสิ่งที่คุณถาม ในกรณีนี้ฉันกำลังส่งข้อมูลจากเซลล์ที่เลือกในมุมมองตารางไปยังตัวควบคุมมุมมองอื่น

ในไฟล์. h ของมุมมอง trget:

@property(weak, nonatomic)  NSObject* dataModel;

ในไฟล์. m:

@synthesize dataModel;

dataModelสามารถstring, intหรือเช่นในกรณีนี้มันเป็นรูปแบบที่มีรายการมากมาย

- (void)someMethod {
     [self performSegueWithIdentifier:@"loginMainSegue" sender:self];
 }

หรือ...

- (void)someMethod {
    UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
    [self.navigationController pushViewController: myController animated:YES];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"storyDetailsSegway"]) {
        UITableViewCell *cell = (UITableViewCell *) sender;
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
        NSDictionary *storiesDict =[topStories objectAtIndex:[indexPath row]];
        StoryModel *storyModel = [[StoryModel alloc] init];
        storyModel = storiesDict;
        StoryDetails *controller = (StoryDetails *)segue.destinationViewController;
        controller.dataModel= storyModel;
    }
}

3

สวิฟท์ 4:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ExampleSegueIdentifier" {
        if let destinationVC = segue.destination as? ExampleSegueVC {
            destinationVC.exampleString = "Example"
        }
    }
}

สวิฟท์ 3:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "ExampleSegueIdentifier" {
            if let destinationVC = segue.destinationViewController as? ExampleSegueVC {
                destinationVC.exampleString = "Example"
            }
        }
    }

0

ฉันเข้าใจปัญหาของการดำเนินการทำสำเนาที่เดียวและดูแลรักษาสถานะเพื่อส่งพารามิเตอร์เพื่อเตรียมพร้อมสำหรับทำต่อ

ฉันหาวิธีทำสิ่งนี้ ฉันได้เพิ่มคุณสมบัติชื่อ userInfoDict ไปยัง ViewControllers โดยใช้หมวดหมู่ และฉันได้แทนที่การทำงานด้วยตัวระบุเช่นกันในลักษณะที่ว่าหากผู้ส่งเป็นตัวของตัวเอง (หมายถึงตัวควบคุมเอง) มันจะผ่าน userInfoDict นี้ไปยัง ViewController ถัดไป

ที่นี่แทนที่จะส่งผ่าน UserInfoDict ทั้งหมดคุณยังสามารถส่งผ่านพารามิเตอร์ที่เฉพาะเจาะจงเป็นผู้ส่งและแทนที่

1 สิ่งที่คุณต้องจำไว้ อย่าลืมเรียกวิธี super ในวิธีของคุณ performSegue


0

ในกรณีที่คุณใช้รุ่น swift ใหม่

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "ChannelMoreSegue" {

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