Làm thế nào để thực hiện Unwind segue theo chương trình?


307

Sử dụng bảng phân cảnh này rất dễ dàng. Bạn chỉ cần kéo hành động để "Thoát". Nhưng làm thế nào tôi nên gọi nó từ mã của tôi?


33
Tôi thấy đây là một câu hỏi hợp lệ - tôi đã có nó. Bạn có thể thực hiện một segue thư giãn theo chương trình bằng cách 1. tạo một segue thủ công (kéo ctrl từ Chủ sở hữu tệp để thoát), 2. đặt tên cho IB, sau đó 3. thực hiện một -performSegueWithIdentifier: sender: trong mã của bạn.
Yang Meyer

6
Không nên bị đóng IMO. Những người dùng đã bỏ phiếu để đóng câu hỏi này dường như không có nền Obj-C / Cocoa Touch.
LJ Wilson

Yang: Làm thế nào để bạn đặt tên cho nó?
sarfata

Tôi chỉ sử dụng [self notifyViewControllAnimated: CÓ hoàn thành: nil]; để thoát khỏi chương trình. Tôi không biết đó là một cách đúng đắn hay không.
tangiaoboy

1
sarfata: Trước tiên, bạn tạo một "segue thư giãn thủ công" bằng cách kéo ctrl từ trình điều khiển khung nhìn sang "Thoát". Sau đó, bạn có thể tìm thấy segue trong Tài liệu phác thảo.
huggie

Câu trả lời:


283
  1. Tạo một segue thủ công ( ctrl-drag từ Chủ sở hữu tệp để thoát),
  2. Chọn nó trong Menu điều khiển bên trái bên dưới nút EXIT màu xanh lá cây.

Chọn nó trong Menu điều khiển bên trái bên dưới nút EXIT màu xanh lá cây

Chèn Tên của Segue để thư giãn.

Sau đó, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.với nhận dạng segue của bạn.


25
1) "Chủ sở hữu tệp" - đó không phải là thuật ngữ cũ? Nó hoạt động với tôi để điều khiển kéo từ trình điều khiển xem đến biểu tượng Thoát của nó. 2) Mặc dù điều đó là hiển nhiên, Xcode đang tìm kiếm một tuyên bố trong Giao diện của IBAction có đối số UIStoryboardSegue; cuộc thảo luận phiên họp WWDC 2012 đã không đề cập đến điều đó và không dán mã đó vào. Nếu không có nó, biểu tượng Thoát của tôi sẽ không hoạt động khi điều khiển kéo đến nó. 3) Thật tuyệt vời khi ở cuối mũi tên lớn màu đỏ của bạn, trong trường Hành động, bạn có thể nhấn mũi tên "đến đó"!
tobinjim

71
Đối với bất kỳ ai, giống như tôi, vẫn gặp khó khăn khi thực hiện câu trả lời này, tôi đã đưa ra một hướng dẫn và ví dụ kỹ lưỡng hơn trong repo này: github.com/bradley/iOSUnwindSegueProgramatically (Không cố gắng quảng cáo bản thân, tôi chỉ đập đầu vào tường trong nhiều giờ về việc này và thấy một thiết lập làm việc giúp tôi.)
bradleygriffith

3
@bradleygriffith Bạn thật tuyệt vời siêu tuyệt vời. Cảm ơn các bước đi tuyệt vời!
Eli_Rozen

7
@bradleygriffith Tôi ước bạn đã đưa ra câu trả lời này để tôi cũng có thể đánh dấu nó! Đóng góp độc đáo của bạn là thiết lập trình điều khiển xem nào nhận được mã nào . Không thể tìm thấy ở bất cứ đâu. Cảm ơn!
Aaron Vegh

3
Điểm mấu chốt, đối với bất kỳ ai vẫn còn gặp phải vấn đề này, đó là IBACTION cần phải nằm trong bộ điều khiển chế độ xem mà bạn đang quay lại, chứ không phải cái mà bạn hiện đang ở. @Bradleygriffith đánh vần điều này trên GitHub, nhưng tôi chưa thấy điều đó đề cập đến bất cứ nơi nào khác. Đó là phần quan trọng.
Axeva

163

Đây là một câu trả lời hoàn chỉnh với Objective C và Swift:

1) Tạo một IBActionsegue thư giãn trong bộ điều khiển xem đích của bạn (nơi bạn muốn segue đến). Bất cứ nơi nào trong tập tin thực hiện.

// Objective C

    - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

2) Trên bộ điều khiển chế độ xem nguồn (bộ điều khiển bạn đang tách biệt), ⌃ + kéo từ "Tên hoạt động" để thoát. Bạn sẽ thấy segue thư giãn được tạo ở bước 1 trong cửa sổ bật lên. (Nếu bạn không nhìn thấy nó, hãy xem lại bước một). Chọn relaxToContainerVC: từ cửa sổ bật lên hoặc bất cứ điều gì bạn đặt tên cho phương thức của mình để kết nối bộ điều khiển nguồn với IBAction thư giãn.

nhập mô tả hình ảnh ở đây

3) Chọn segue trong phác thảo tài liệu của bộ điều khiển chế độ xem nguồn của bảng phân cảnh (nó sẽ được liệt kê ở gần cuối) và cung cấp cho nó một mã định danh .

nhập mô tả hình ảnh ở đây

4) Gọi segue thư giãn bằng phương pháp này từ nguồn bộ điều khiển xem , thay thế tên segue thư giãn của bạn.

// Mục tiêu C

[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];

// Swift

self.performSegueWithIdentifier("unwindToContainerVC", sender: self)

Lưu ý Sử dụng thuộc tính sourceViewContaptor của tham số segue trên phương thức relax để truy cập bất kỳ thuộc tính được hiển thị nào trên bộ điều khiển nguồn. Ngoài ra, lưu ý rằng khung xử lý loại bỏ bộ điều khiển nguồn. Nếu bạn muốn xác nhận điều này, hãy thêm một phương thức dealloc vào bộ điều khiển nguồn với thông điệp tường trình sẽ kích hoạt một khi nó đã bị giết. Nếu dealloc không bắn, bạn có thể có chu kỳ giữ lại.


2
Chương trình của tôi không hoạt động, thậm chí không được gọi(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
xhg

2
giải pháp này không hoạt động khi trình điều khiển xem, bạn không muốn, chỉ tồn tại trong bảng phân cảnh của bạn, hay còn gọi là không có tùy chỉnh trong triển khai mã
mnl

@mnl không chắc chắn chính xác những gì bạn đang nói, nhưng nó hoạt động với các cảnh trong truyện hoặc ngòi. Nếu bạn đang tạo một cảnh điều khiển khung nhìn trong mã thì bạn sẽ không sử dụng bất kỳ phương thức nào "trả lại" IB trong tên của chúng, điều này thực sự vô hiệu vì chúng phục vụ mục đích giao tiếp giữa mã và IB. Điều đó có giải quyết bình luận của bạn?
smileBot

1
Hình ảnh của bạn cho thấy ctrl+dragtừ ViewControllerđến Exitlà vô cùng hữu ích. Cảm ơn!
kbpontius

Đối với Swift 4.2, hãy sử dụng: self.performSegue (withIdentifier: "relaxToVC", người gửi: tự)
Reefwing

81

bradleygriffithCâu trả lời rất hay. Tôi đã thực hiện bước 10 và tạo một ảnh chụp màn hình để đơn giản hóa. Đây là một ảnh chụp màn hình trong Xcode 6.

  1. Điều khiển kéo từ biểu tượng màu cam sang biểu tượng Thoát màu đỏ để tạo thư giãn mà không có bất kỳ hành động / nút nào trong chế độ xem.

nhập mô tả hình ảnh ở đây

  1. Sau đó chọn unwind seguethanh bên:

nhập mô tả hình ảnh ở đây

  1. Đặt chuỗi Định danh phân đoạn:

nhập mô tả hình ảnh ở đây

  1. Truy cập mã định danh đó từ mã:
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];

4
Trước hết, phương pháp tháo gỡ phải được đưa vào bên trong UIViewController. Sau đó, giải pháp của bạn sẽ hoạt động
Alex Cio

5
và bạn phải đặt Định danh cho segue mới này! Đừng quên điều đó.
kraag22

1
Có thể tạo kết nối "thoát" trong bộ điều khiển xem nguồn theo chương trình không?
Andrew Kirna

13

Tôi đã sử dụng [self dismissViewControllerAnimated: YES completion: nil];sẽ đưa bạn trở lại cuộc gọi ViewController.


6
Larry, đó là một cách tiếp cận hoàn toàn hợp lệ nếu bạn muốn quay lại trình điều khiển chế độ xem trước đó, tức là cách tiếp cận trình bày mà bạn hiện đang thoát. Câu hỏi được đặt ra bởi vì mới trong Xcode 4.5 là khả năng "thư giãn" từ một bộ điều khiển chế độ xem ở đâu đó theo thứ tự trình bày sang bộ điều khiển xem trước đó nhiều. Xem WWDC 2012 phiên 407 để biết chi tiết.
tobinjim

11

Trích dẫn văn bản từ Ghi chú kỹ thuật của Apple về Unwind Segue: Để thêm một phân tách thư giãn sẽ chỉ được kích hoạt theo chương trình, hãy điều khiển + kéo từ biểu tượng trình điều khiển chế độ xem cảnh vào biểu tượng thoát của nó, sau đó chọn hành động thư giãn cho phân đoạn mới từ menu bật lên.

Liên kết đến ghi chú kỹ thuật


6

Câu trả lời của Vishal Chaudhry ở trên đã làm việc cho tôi. Tôi cũng sẽ thêm rằng để kích hoạt trình tự bằng cách sử dụng:

[self performSegueWithIdentifier:@"mySegueName" sender:self];

từ bên trong ViewContoder, bạn cũng phải chọn phân tách thư giãn trong Cảnh của ViewContoder trong bảng phân cảnh và trong chế độ xem thuộc tính trên RHS đảm bảo rằng trường Indentifier chứa tên người bạn đang đề cập đến trong mã ("mySegueName" trong ví dụ trên ).

Nếu bạn bỏ qua bước này, dòng trên sẽ đưa ra một ngoại lệ mà tên seque không được biết đến.


3

Giải pháp tương thích ngược sẽ hoạt động cho các phiên bản trước ios6, dành cho những người quan tâm:

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

2
Hủy bỏ phân tách làm nhiều việc hơn là bật trở lại một lớp nhất định trong ngăn xếp bộ điều khiển điều hướng.
Steve Moser

2

Chuyển 4 :

1. Tạo một @IBAction với segue bên trong bộ điều khiển mà bạn muốn thư giãn để:

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2. Trong bảng phân cảnh, từ bộ điều khiển bạn muốn tách (thư giãn) từ ctrl + kéo từ dấu hiệu bộ điều khiển để thoát dấu và chọn phương thức bạn đã tạo trước đó:

nhập mô tả hình ảnh ở đây

3. Bây giờ bạn có thể nhận thấy rằng trong phác thảo tài liệu, bạn có dòng mới với tiêu đề "Unwind segue ....". Bây giờ bạn nên nhấp vào dòng này và mở trình kiểm tra thuộc tính để đặt định danh (trong trường hợp của tôi là relaxSegueIdentifier ).

nhập mô tả hình ảnh ở đây

4. Bạn sắp hoàn thành! Bây giờ bạn cần mở trình điều khiển xem bạn muốn thư giãn và tạo một số phương thức sẽ thực hiện segue. Ví dụ: bạn có thể thêm nút, kết nối nó với mã với @IBAction , sau đó bên trong IBAction này thêm perfromSegue (withIdentifier: sender :) phương thức:

     @IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
         performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
     }

Vì vậy, đó là tất cả những gì bạn phải làm!


Có thể tạo kết nối "thoát" trong bộ điều khiển xem nguồn theo chương trình không?
Andrew Kirna

1

Swift 4.2, Xcode 10+

Đối với những người tự hỏi làm thế nào để làm điều này với các VC không được thiết lập thông qua bảng phân cảnh (những người đến với câu hỏi này từ việc tìm kiếm "lập trình" + "thư giãn segue").

Cho rằng bạn không thể thiết lập một segue thư giãn theo chương trình, giải pháp lập trình đơn giản nhất là gọi:

navigationController?.popToRootViewController(animated: true)

sẽ bật tất cả các bộ điều khiển xem trên ngăn xếp trở lại bộ điều khiển xem gốc của bạn.


Để bật chỉ bộ điều khiển xem trên cùng từ ngăn xếp điều hướng, sử dụng:

navigationController?.popViewController(animated: true)


1
đó thường là nhiều hơn bạn muốn - để bật lại một lần nữa: [self.navlationControll popViewControllAnimated: YES];
Andy Weinstein

Thật vậy, tôi đã thêm nó vào câu trả lời của mình - cảm ơn @AndyWeinstein
10623169

0

FYI: Để câu trả lời của @ Vadim hoạt động với một hành động tuần tự thư giãn thủ công được gọi từ bên trong Bộ điều khiển xem, bạn phải đặt lệnh:

[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];

bên trong của phương thức lớp overriden viewDidAppear như vậy:

-(void) viewDidAppear:(BOOL) animated
{
    [super viewDidAppear: animated];

    [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}

Nếu bạn đặt nó trong các phương thức ViewContoder khác như viewDidLoad hoặc viewWillAppear thì nó sẽ bị bỏ qua.


3
Chắc chắn là sai. Gọi PerformanceSegueWithIdentifier từ bất cứ nơi nào bạn muốn.
smileBot

Điều này sẽ không thực hiện thư giãn ngay sau khi tải xem? Thay vì thực hiện khi BẠN muốn, ví dụ sau khi nhấn nút.
Pahnev

@Pahnev đúng vậy. Tôi không biết làm thế nào câu trả lời này có bất kỳ upvote. Việc gọi performSegueWithIdentfierthực hiện chính xác điều đó: thực hiện phân tách từ một ViewContoder sang một trình điều khiển khác
ezcoding

Hoàn toàn sai. Nó sẽ chỉ tua lại ngay lập tức khi khởi động.
Lee Probert
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.