2015-02-07 14 views
14

Tôi vừa mới tìm ra một điểm dừng chân thư giãn và cách sử dụng nó với những câu trả lời tuyệt vời từ câu hỏi this. Cảm ơn rất nhiều.Làm thế nào để làm điều gì đó trước khi thư giãn hành động segue?

Tuy nhiên, đây là một câu hỏi như thế này:

Hãy nói rằng có một nút trong cảnh B mà thư giãn segues đến cảnh A, và trước khi nó segues Tôi muốn một cái gì đó để được thực hiện, chẳng hạn như lưu dữ liệu đến cơ sở dữ liệu . Tôi tạo ra một hành động cho nút này trong B.swift, nhưng có vẻ như nó đi trực tiếp đến cảnh A mà không thực hiện hành động được chỉ định.

Bất cứ ai cũng biết lý do hoặc cách thực hiện việc này?

Cảm ơn bạn.

+0

Nếu bạn đang sử dụng một segue Thư giãn thực tế (như trái ngược với một nút quay lại đơn giản trong một 'UINavigationController' sau đó' prepareForSegue' sẽ được gọi ở cả hai nguồn và đích điểm điều khiển - https: // nhà phát triển. apple.com/library/ios/technotes/tn2298/_index.html#//apple_ref/doc/uid/DTS40013591-CH1-UNWINDPROC Bạn sẽ cần phải cung cấp cho bạn khoảng cách thư giãn và nhận dạng trong bảng phân cảnh nếu bạn chưa làm như vậy để xác định nó trong 'PrepareForSegue' – Paulw11

+0

' prepareForSegue' chỉ được gọi trong bộ điều khiển xem nguồn thực tế – Nickkk

Trả lời

19

Bạn có thể làm điều đó theo cách bạn mô tả, hoặc bằng cách sử dụng một hàm prepareForSegue override trong viewController bạn đang ươm từ:

@IBAction func actionForUnwindButton(sender: AnyObject) { 
    println("actionForUnwindButton"); 
} 

hoặc ...

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    println("prepareForSegue"); 
} 

Ví dụ đầu tiên là khi bạn mô tả. Nút được kết nối với khoảng cách thư giãn và thao tác nút trong Trình tạo giao diện. Hành động nút sẽ được kích hoạt trước hành động segue. Có lẽ bạn đã không kết nối hành động với nút trong trình tạo giao diện?

Ví dụ thứ hai cho phép bạn có quyền truy cập vào sourceViewControllerdestinationViewController của segue trong trường hợp cũng hữu ích (bạn cũng nhận được các chức năng này trong chức năng tách biệt của thư giãn trong bộ điều khiển chế độ xem đích).

Nếu bạn muốn trì hoãn việc segue Thư giãn cho đến khi hành động địa phương của nút hoàn tất, bạn có thể gọi segue trực tiếp từ hành động nút (thay vì hooking nó lên trong storyboard) sử dụng self.performSegueWithIdentifier (hoặc làm theo gợi ý wrUS61 của)

EDIT

bạn dường như có một số nghi ngờ cho dù bạn có thể làm việc này bằng cách nối dây lên nút của bạn cả một segue thư giãn và để một button action. Tôi đã thiết lập một dự án thử nghiệm nhỏ như thế này:

class BlueViewController: UIViewController { 

    @IBAction func actionForUnwindButton(sender: AnyObject) { 
     println("actionForUnwindButton"); 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     println("prepareForSegue"); 
    } 
} 


class RedViewController: UIViewController { 

    @IBAction func unwindToRed(sender: UIStoryboardSegue) { 
     println("unwindToRed"); 
    } 
} 

BlueViewController có một nút được kết nối trong storyboard để BOTH segue Thư giãn unwindToRed VÀ nút actionForUnwindButton. Nó cũng ghi đè prepareForSegue để chúng tôi có thể ghi lại thứ tự phát.

Output:

actionForUnwindButton 
prepareForSegue 
unwindToRed 

Storyboard:

enter image description here

EDIT 2

dự án trình diễn của bạn hiển thị này không làm việc. Sự khác biệt là bạn đang sử dụng một barButtonItem để kích hoạt hành động, trong khi tôi đang sử dụng một nút thông thường. Một barButtonItem không thành công, trong khi một nút thông thường thành công. Tôi nghi ngờ rằng điều này là do sự khác biệt về thứ tự của thông điệp qua (những gì sau là phỏng đoán, nhưng phù hợp với hành vi quan sát):

(A) UIButton trong View Controller

nút ViewController của nhận touchupInside
- (1) gửi hành động để nó là phương pháp
- (2) gửi hành động Thư giãn segue để kịch bản segue
tất cả các thư nhận được, và phương pháp thực hiện theo thứ tự này:

actionForUnwindButton 
prepareForSegue 
unwindToRed 

(B) UIBarButtonItem trong Navigation khiển Toolbar thanh công cụ

buttonItem nhận touchupInside
- (1) gửi hành động Thư giãn segue để kịch bản segue
- (2) (có thể, sau đó) gửi hành động để phương pháp viewController của

Trình tự thực hiện là

prepareForSegue 
unwindToRed 
actionForUnwindButton 

prepareForSegueunwind tin nhắn nhận được. Tuy nhiên actionForUnwindButton tin nhắn được gửi đến nil như viewController bị phá hủy trong quá trình segue. Vì vậy, nó không được thực thi, và các bản in log

prepareForSegue 
unwindToRed 

Trong trường hợp (B), các viewController bị phá hủy trước khi phương pháp này đạt nó, vì vậy tôi không nhận được kích hoạt

Vì vậy, có vẻ như bạn tùy chọn là ...
(a) sử dụng UIButton với hành động và thư giãn segue
(b) kích hoạt hành động của bạn bằng cách sử dụng prepareForSegue, sẽ được kích hoạt trong khi viewController vẫn còn hoạt động và trước khi segue diễn ra.
(c) không sử dụng khoảng cách thư giãn, chỉ cần sử dụng thao tác nút. Trong phương thức hành động, bạn có thể 'thư giãn' bằng cách gọi số popToViewController trên bộ điều khiển điều hướng của bạn.

Bằng cách này, nếu bạn triển khai một thanh công cụ trên viewController (không sử dụng thanh công cụ của bộ điều hướng) kết quả là như nhau: segue được kích hoạt trước, do đó, thao tác nút không thành công.

enter image description here

+0

Cảm ơn bạn rất nhiều, thân yêu đúc. Tôi thực sự hy vọng rằng ví dụ đầu tiên khi bạn đề xuất công việc gây ra nó là cách đơn giản nhất nhưng nó không, và Im chắc chắn rằng nút và hành động được kết nối. Oh, và nút tôi có nghĩa là thực sự là một mục công cụ dưới thanh, hiện vấn đề này? – Mechanic

+0

@Mechanic, nó hoạt động theo cách đó trong các bài kiểm tra của tôi. Xem cập nhật của tôi. – foundry

+0

Thưa các bạn thân mến, cảm ơn bạn rất nhiều vì lời giải thích chi tiết của bạn. Tôi mới để nhanh chóng và iOS mã hóa và tiếc là tôi vẫn không thể làm cho nó đúng. Bạn vui lòng kiểm tra mã của tôi ở đây [link] (https://github.com/xujiemechanic/UnwindSegueTest)? – Mechanic

1

Lúc đầu, bạn nên gọi hàm gửi dữ liệu trong phương thức prepareForSegue.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if([[segue identifier] isEqualToString:@"UnwindIdentifier"]) { 
     // send data 
    } 
} 

Nếu bạn không muốn để cho segue Thư giãn xảy ra trước khi nhận được phản hồi từ máy chủ, bạn nên ghi đè

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 

phương pháp và return NO;. Sau đó, bạn có thể thực hiện phân tách theo cách thủ công khi bạn nhận được phản hồi của máy chủ bằng cách gọi:

[self performSegueWithIdentifier:@"UnwindIdentifier" sender:sender]; 
+0

Cảm ơn bạn rất nhiều wrUS61, phương pháp này thực sự hoạt động. khi một nút được kết nối cả hai đến một khoảng cách thư giãn và một hành động sau đó nó chỉ phản ứng với segue thư giãn? – Mechanic

2

Nếu bạn có thể thực hiện phân đoạn không thành công. Sau đó, phương thức trong View Controller đích được gọi ngay trước khi segue diễn ra, bạn có thể làm những gì bạn muốn trong source viewcontroller bằng cách sử dụng đối tượng segue.

- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue 
{ 
    CustomViewController *vc = (CustomViewController*) unwindSegue.sourceViewController; 
    [vc performAnyMethod]; 
    [vc saveData]; 
    NSString *temp = vc.anyProperty; 

} 

nếu bạn muốn logic của bạn trong nguồn điều khiển sau đó thực hiện prepareForSegue trong Scene B và thiết lập các định danh segue thư giãn khỏi Cốt truyện> Left Xem hệ thống phân cấp Panel> dưới Exit trong Scene B.

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([[segue identifier] isEqualToString:@"backToSource"]) 
    { 
     NSLog(@"Going Back"); 

    } 
} 
+0

Cảm ơn bạn rất nhiều, Irfan Gul, Cách này có thể hoạt động nhưng tôi cảm thấy rằng tốt hơn nên đặt những mã này vào VC nguồn. Bất kỳ ý tưởng? – Mechanic

+0

cho tôi một phút. –

Các vấn đề liên quan