2013-08-19 37 views
25

Có thể trong iOS 6 để biết khi nào UIStoryboardSegue đã hoàn tất quá trình chuyển đổi của nó? Giống như khi tôi thêm một số UIStoryboardSegue từ UIButton để đẩy một số UIViewController khác trên trình điều hướng điều hướng, tôi muốn làm điều gì đó ngay sau khi quá trình đẩy chuyển tiếp kết thúc.Làm thế nào để thực hiện một số mã sau khi một segue được thực hiện?

Trả lời

19

Bạn có thể sử dụng giao thức UINavigationControllerDelegate và sau đó xác định:

– navigationController:didShowViewController:animated: 
+0

Không phải là xấu như tôi mong đợi. 'self.navigationController = self;' và thêm phương thức đó. Tôi đã lưu các bộ điều khiển vào các biến cục bộ dựa trên ID Segue và sau đó so sánh các giá trị đó với 'ViewController' đã truyền. –

+7

Điều này sẽ làm việc cho các phân đoạn đẩy nơi bộ điều khiển xem có nguồn gốc có bộ điều khiển điều hướng, nhưng phải làm gì trong trường hợp phân đoạn phương thức? – Drux

+1

Tôi đã sử dụng câu trả lời Segue tùy chỉnh từ Levi và triển khai thực hiện 'hoạt động' của tôi như ví dụ ở đây: http://stackoverflow.com/a/23778394/586489 Điều này hoạt động khá độc đáo, tôi biết khi nào việc đẩy hoàn thành và có thể sử dụng phân đoạn. –

14

Trong trường hợp bạn không muốn sử dụng phương thức viewDidAppear:, bạn có thể tạo phân đoạn tùy chỉnh. Trong phương thức perform, bạn sẽ sử dụng hoạt ảnh cho quá trình chuyển đổi và có thể có khối hoàn thành. Bạn có thể thêm mã ở đó sau khi hoạt ảnh hoàn tất.

+0

Vì vậy, không thể có phân đoạn kéo và thả chuẩn trong Bảng phân cảnh? – hakonbogen

+2

Đó là cách bạn tạo nó, nhưng bạn phải phân lớp 'UIStoryboardSegue' và thực hiện phương thức' perform' trong đó. Sau đó, trong 'storyboard' bạn đặt class của segue thành cái bạn vừa tạo. – Levi

-9

Bạn có thể sử dụng - (void) prepareForSegue: (UIStoryboardSegue *) segue người gửi: (id) sender

Phương pháp này sẽ được gọi ngay trước khi một segue được thực hiện trong nguồn UIViewController. Nếu bạn muốn làm một số mã trong UIViewController đích, bạn có thể nhận được bộ điều khiển xem đích của segue.

Bạn cũng có thể thêm mã này trong viewdidAppear trong khung nhìn desintationController.

-9

bạn có thể gọi phương thức UIViewController đích trong phương thức prepareForSegue.

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    NSLog(@"prepareForSegue: %@", segue.identifier); 

    if ([segue.identifier isEqualToString:@"Happy"]) { 
     [segue.destinationViewController setHappiness:100]; 
    } else if ([segue.identifier isEqualToString:@"Sad"]) { 
     [segue.destinationViewController setHappiness:0]; 
    } 
} 

tại đây thiết lậpChế độ áp dụng là bộ điều khiển đích và tại đây 100 đang chuyển đến đó. vì vậy bạn có thể viết một phương pháp trong điều khiển điểm đến và gọi nó là ở đây

+3

Đó không phải là thực sự chỉ ra khi segue thực sự là hoàn thành mặc dù điều này xảy ra ở đầu của segue – Sam

7

Trong Swift, từ một lớp con UIViewController bạn có thể lấy ví dụ UINavigationController và thiết lập đại biểu, để được thông báo về việc hoàn thành các phân đoạn, như được hiển thị. Một nơi hợp lý khác để theo dõi các phân đoạn có thể là AppDelegate.

Ví dụ về làm việc đó từ một bộ điều khiển view (viết tắt là VC):

class MyViewControllerSubclass : UIViewController, UINavigationControllerDelegate { 

    func viewDidLoad() { 
     self.navigationController.delegate = self 
    } 

    func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     println("Did show VC: \(viewController)") 
    } 
} 

Nhưng điều đó chỉ cho thấy bạn khi segue để VC được hoàn tất, như sẽ viewWillAppear() hoặc viewDidAppear() phương pháp đại biểu trong VC được trình bày; tuy nhiên, họ không thông báo về thời điểm VC mục tiêu là un -presented.

Trong VC bạn đang theo dõi, bạn có thể thêm phần sau đây để phát hiện khi nào VC (và bộ nhớ của nó) được deallocated, hoặc ghi đè phương pháp viewWillDisappear().

deinit { 
    println(__FUNCTION__, "\(self)") 
}