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 sourceViewController
và destinationViewController
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:
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
prepareForSegue
và unwind
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.
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
' prepareForSegue' chỉ được gọi trong bộ điều khiển xem nguồn thực tế – Nickkk