11

Làm cách nào để bạn có thể đẩy đến bộ điều khiển chế độ xem khác mà không cần prepareForSegue?đẩy đến một bộ điều khiển chế độ xem khác mà không cần chuẩn bịForForegue

myClassVC *viewController = [myClassVC alloc]; 
UIStoryboardSegue *segue = [[UIStoryboardSegue alloc] initWithIdentifier:@"pushToMyVC" source:self destination:viewController]; 

if ([segue.identifier isEqualToString:@"pushToMyVC"]) { 
NSLog(@"logging"); 
myClassVC *viewController = (myClassVC *)[segue destinationViewController]; 
[self presentViewController:viewController animated:YES completion:nil];   
} 

Trả lời

45

Nếu bạn muốn lập trình gọi một segue đẩy, bạn cung cấp cho segue một "id kịch bản" trong Interface Builder và sau đó bạn có thể:

[self performSegueWithIdentifier:"pushToMyVC" sender:self]; 

Ngoài ra, nếu bạn không muốn thực hiện các segue , bạn có thể khởi tạo trình điều khiển xem đích và sau đó đẩy thủ công vào trình điều khiển chế độ xem đó. Tất cả bạn cần làm là để đảm bảo rằng bộ điều khiển xem đích có riêng "storyboard id" của nó trong giao diện Builder, sau đó bạn có thể:

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DestinationController"]; 
[self.navigationController pushViewController:controller animated:YES]; 

Bạn nói "đẩy" (và vì thế tôi đã sử dụng pushViewController ở trên). Nếu bạn thực sự có nghĩa là để "trình bày một bộ điều khiển xem phương thức", sau đó dòng thứ hai là:

[self presentViewController:controller animated:YES completion:nil]; 

Như bạn thấy, bạn không sử dụng prepareForSegue để đẩy đến cảnh mới. Bạn chỉ sử dụng prepareForSegue nếu bạn muốn chuyển thông tin tới bộ điều khiển chế độ xem đích. Nếu không thì không cần thiết.

Rõ ràng, nếu bạn không sử dụng bảng phân cảnh (ví dụ: bạn đang sử dụng NIB), thì quá trình này hoàn toàn khác. Nhưng tôi cho rằng bạn không sử dụng NIB vì prepareForSegue không áp dụng được trong môi trường đó. Nhưng nếu bạn đang sử dụng NIB, nó sẽ là như sau:

SecondViewController *controller = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 
[self.navigationController pushViewController:controller animated:YES]; 
+0

Câu trả lời này rất hữu ích! – Plagorn

3

không cần thiết vì segue sẽ đẩy trình điều khiển chế độ xem đích bằng cách sử dụng chuyển đổi bạn đã chọn tự động.

Nếu bạn không muốn sử dụng quá trình segue bạn sẽ cần phải tự đẩy điều khiển xem với:

[self presentViewController:viewController animated:YES completion:nil];

nhưng chắc chắn rằng bạn loại bỏ các segues trong Storyboard đầu tiên.

0
NSString * storyboardName = @"Main"; 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil]; 
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewControllerID"]; 
    [self presentViewController:vc animated:YES completion:nil]; 
0

Trong trường hợp của tôi tất cả đều được xây dựng viewControllers động. Tôi không sử dụng bảng phân cảnh cho mục đích này. Nếu đây là trường hợp của bạn, bạn chỉ có thể khởi tạo lớp viewController mà bạn muốn mở và đẩy như trong ví dụ dưới đây:

MyViewController* myViewController = [[MyViewController alloc] init]; 
[self.navigationController pushViewController:myViewController animated:YES]; 
Các vấn đề liên quan