Thực hiện phân đoạn theo chương trình và truyền tham số cho chế độ xem đích


174

trong ứng dụng của tôi, tôi có một nút thực hiện phân tách theo chương trình:

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

Tôi muốn biết nếu có một cách để tham chiếu khung nhìn đích và truyền cho nó một số tham số.

Tôi biết rằng trong prepareForSeguephương thức, tôi có thể đề cập đến nó bằng myDestinationViewController *vc = [segue destinationViewController];:, nhưng tôi không biết làm thế nào để thực hiện phân tách này theo chương trình.

Bạn có bất cứ ý tưởng?

Cảm ơn


CẬP NHẬT:

Tôi xin lỗi vì câu hỏi này !!! Tôi chỉ đơn giản phát hiện ra rằng, ngay cả khi segue được gọi bằng lập trình, prepareForSeguephương thức vẫn được gọi bằng mọi cách và do đó có thể truyền tham số theo cùng một cách thông thường.


44
Thêm bản cập nhật dưới dạng câu trả lời và chấp nhận nó để mọi người biết điều này đã được trả lời :)
danielbeard

Thêm câu trả lời, bình luận để thông báo.
DanSkeel

11
Bạn nên đánh dấu câu trả lời dưới đây là chính xác, để mọi người biết rằng nó đã được trả lời.
cáo lindon

Câu trả lời:


107

Câu trả lời đơn giản là nó không tạo ra sự khác biệt như thế nào khi segue được kích hoạt.

Các prepareForSegue:sender:phương pháp được gọi là trong mọi trường hợp và đây là nơi mà bạn vượt qua các thông số của bạn trên.


3
Điều này vẫn làm phiền tôi - điều này có nghĩa là tôi phải kích hoạt segue ở một nơi, nơi tôi có dữ liệu mà tôi muốn gửi dưới dạng tham số độc lập với bất kỳ thứ gì khác, nhưng để thêm dữ liệu đó vào một nơi hoàn toàn khác - chuẩn bịForForSegue, nơi chúng tôi không biết gì về dữ liệu cần phải được thông qua. Có nghĩa là, tôi phải tạo một trạng thái với dữ liệu đó được đề cập trong ngữ cảnh được chia sẻ bởi hai chức năng khác nhau (một hàm kích hoạt, trạng thái khác - chuẩn bị). Tôi không muốn làm bẩn trạng thái khi tất cả những gì tôi cần là mở một chế độ xem mới với một số dữ liệu ...
NeverwinterMoon

Sử dụng người gửi để vượt qua bối cảnh cần thiết để định cấu hình VC đích
người bẫy

Tôi giả định rằng việc chuyển tải trọng trong người gửi là một mô hình chống. Nó chỉ nên chứa thông tin về người đã kích hoạt segue, chứ không phải dữ liệu mà thứ đã kích hoạt segue dự định vượt qua.
NeverwinterMoon

Từ các tài liệu chính thức về người gửi: "Đối tượng này được cung cấp cho mục đích thông tin trong thời gian thực tế."
NeverwinterMoon

1
Vâng không vượt qua một tải trọng thực tế, vượt qua bối cảnh, như ô / nút / chỉ mục / vv đã kích hoạt sự khác biệt.
Bẫy

90

Câu hỏi cũ nhưng đây là mã về cách làm những gì bạn đang hỏi. Trong trường hợp này, tôi chuyển dữ liệu từ một ô đã chọn trong chế độ xem bảng sang bộ điều khiển xem khác.

trong tệp .h của chế độ xem trget:

@property(weak, nonatomic)  NSObject* dataModel;

trong tệp .m:

@synthesize dataModel;

dataModelcó thể string, inthoặc giống như trong trường hợp này, đó là một mô hình có chứa nhiều mặt hàng

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

HOẶC LÀ...

- (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

Swift 4:

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

Swift 3:

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

0

Tôi hiểu vấn đề thực hiện segue tại một nơi và duy trì trạng thái để gửi tham số để chuẩn bị cho segue.

Tôi đã tìm ra một cách để làm điều này. Tôi đã thêm một thuộc tính có tên userInfoDict cho ViewControllers bằng một danh mục. và tôi cũng đã ghi đè thực hiện segue với mã định danh, theo cách mà Nếu người gửi là chính mình (có nghĩa là chính bộ điều khiển). Nó sẽ chuyển userInfoDict này sang ViewContoder tiếp theo.

Ở đây thay vì chuyển toàn bộ UserInfoDict, bạn cũng có thể truyền các thông số cụ thể, dưới dạng người gửi và ghi đè tương ứng.

1 điều bạn cần ghi nhớ. đừng quên gọi siêu phương thức trong phương thức biểu diễn của bạn.


0

Trong trường hợp nếu bạn sử dụng phiên bản swift mới.

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

        }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.