2015-06-22 12 views
5

Tôi có một tùy chọn bool biến gọi là showSettings trên bộ điều khiển xem đầu tiên của tôi được gọi là ViewController, và tôi popping từ SecondViewController trở lại ViewController.Swift - Sử dụng popViewController và truyền dữ liệu đến các ViewController bạn đang trở về

Trước khi tôi bật, tôi muốn đặt giá trị bool thành true. Có vẻ sai khi khởi tạo một trình điều khiển chế độ xem khác vì ViewController có trong bộ nhớ.

Cách tốt nhất để làm điều này là gì? Tôi không sử dụng bảng phân cảnh, nếu điều đó quan trọng đối với câu trả lời của bạn.

Nhờ sự giúp đỡ của bạn

+0

câu trả lời mà bạn đang tìm kiếm là về bài đăng này [nó có thể truyền dữ liệu với popViewControllerAnimated?] [ 1] [1]: http://stackoverflow.com/questions/13509832/it-possible-to-pass-data-with-popviewcontrolleranimated –

Trả lời

13

Vì vậy, tôi figured it out, dựa chủ yếu từ bài này - http://makeapppie.com/2014/09/15/swift-swift-programmatic-navigation-view-controllers-in-swift/

Trong SecondViewController, trên khai báo lớp, thêm mã này:

protocol SecondVCDelegate { 
    func didFinishSecondVC(controller: SecondViewController) 
} 

Sau đó bên trong của SecondViewContoller thêm biến lớp học:

var delegate: MeditationVCDelegate! = nil

Sau đó bên trong hàm của bạn rằng mục tiêu nút bấm của bạn, thêm này:

self.navigationController?.popViewControllerAnimated(true) 
delegate.didFinishSecondVC(self) 

Những gì chúng ta đang làm gì ở đây đang làm pop trong SecondViewControllerkhông đi qua bất kỳ dữ liệu, nhưng kể từ khi chúng tôi đã xác định một giao thức, chúng ta sẽ sử dụng nó trong ViewController để xử lý dữ liệu.

Vì vậy, tiếp theo, trong ViewController, thêm giao thức bạn được định nghĩa trong SecondViewController vào danh sách các lớp ViewController thừa hưởng từ:

class ViewController: UIViewController, SecondVCDelegate { ... your code... } 

Bạn sẽ cần phải thêm chức năng chúng tôi đã định nghĩa trong giao thức mới nhằm làm cho trình biên dịch trở nên hạnh phúc. Bên trong lớp ViewController 's, thêm này:

func didFinishSecondVC(controller: SecondViewController) { 
    self.myBoolVar = true 
    controller.navigationController?.popViewControllerAnimated(true) 
} 

Trong SecondViewController nơi chúng tôi đang gọi điện thoại didFinishSecondVC, chúng tôi đang gọi phương pháp này bên trong lớp ViewController, bộ điều khiển chúng ta popping để. Nó tương tự như nếu chúng tôi đã viết mã này bên trong SecondViewController nhưng chúng tôi đã viết nó bên trong của ViewController và chúng tôi đang sử dụng một đại biểu để quản lý tin nhắn giữa hai người.

Cuối cùng, trong ViewController, trong hàm chúng ta đang nhắm mục tiêu đến đẩy-SecondViewController, thêm mã này:

let secondVC = secondViewController() 
secondVC.delegate = self 
self.navigationController?.pushViewController(secondVC, animated: true) 

Vậy là xong! Bạn nên được tất cả các thiết lập để vượt qua mã giữa hai bộ điều khiển xem mà không cần sử dụng storyboards!

+0

tôi tin 'var đại biểu: MeditationVCDelegate! = nil' nên là 'var delegate: SecondVCDelegate! = nil', phải không? – oelna

+1

Giải pháp tuyệt vời! Cảm ơn Zack! – Cristina

0

Tôi đã xem xét điều này trong khi tìm cách để thực hiện. Vì tôi sử dụng Storyboards thường xuyên hơn, tôi thấy rằng tôi có thể nhận được mảng các bộ điều khiển trong ngăn điều hướng, lấy một bộ điều khiển ngay trước nút hiện tại ở trên đầu, kiểm tra xem đó có phải là đại biểu của tôi hay không đại biểu, thiết lập phương pháp của tôi, sau đó bật bản thân mình từ ngăn xếp.Mặc dù mã nguồn trong ObjC, nó phải là dễ dàng thể dịch để nhanh chóng:

// we need to get the previous view controller 
NSArray *array = self.navigationController.viewControllers; 
if (array.count > 1) { 
    UIViewController *controller = [array objectAtIndex:(array.count - 2)]; 
    if ([controller conformsToProtocol:@protocol(GenreSelectionDelegate)]) { 
     id<GenreSelectionDelegate> genreDelegate = (id<GenreSelectionDelegate>)controller; 
     [genreDelegate setGenre:_selectedGenre]; 
    } 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
8
_ = self.navigationController?.popViewController(animated: true) 
     let previousViewController = self.navigationController?.viewControllers.last as! PreviousViewController 
     previousViewController.PropertyOrMethod 
+0

Điều này làm việc cho tôi cảm ơn bạn –

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