2014-08-31 15 views
7

Tôi mới lập trình & Swift và tôi đang cố gắng hiểu cách truyền dữ liệu giữa hai bộ điều khiển chế độ xem (không phân biệt) với giao thức và đại biểu.Cố gắng hiểu giao thức/đại biểu trong Swift

Tôi có Bộ điều khiển chế độ xem (VIEW A) có một trường văn bản và nút. Khi người dùng nhấn nút đó, nó sẽ hiển thị văn bản đó trong nhãn trong một Trình điều khiển Chế độ xem khác (VIEW B).

Tôi không thể nhận nhãn để hiển thị văn bản - Tôi sẽ đánh giá cao giải thích về những gì cần thiết để thực hiện tác phẩm này.

Cảm ơn bạn rất nhiều!

import UIKit 

      protocol sendNameToViewB { 

       func showNameLabel(name:String) 
      } 

      class ViewA: UIViewController { 

       var delegate: sendNameToViewB? 

       @IBOutlet weak var textField: UITextField! 

       @IBAction func addButton(sender: AnyObject) { 
        delegate?.showNameLabel(textField.text) 

       } 
       override func viewDidLoad() { 
        super.viewDidLoad() 

        // Do any additional setup after loading the view, typically from a nib. 
       } 
       override func didReceiveMemoryWarning() { 
        super.didReceiveMemoryWarning() 
        // Dispose of any resources that can be recreated. 
       } 


      } 

      class ViewB: UIViewController, sendNameToViewB { 

       @IBOutlet weak var theLabel: UILabel! 

       func showNameLabel(name: String) { 
        theLabel.text = name 
       } 
      } 

VIEW CONTROLLERS

Trả lời

8

Đầu tiên, một lưu ý: tên của bạn để xem các bộ điều khiển nên bao gồm "ViewController" trong tên. Có một bộ sưu tập các lớp học hoàn toàn khác nhau được kế thừa từ UIView. Đặt tên cho một View Controller chỉ ViewA làm cho nó trông giống như lớp của bạn chỉ là một khung nhìn thay vì một bộ điều khiển khung nhìn. Lượt xem nằm trong một lớp hoàn toàn khác của ứng dụng của bạn.

Bây giờ, để chuyển dữ liệu đến một đối tượng khác, yêu cầu đầu tiên của bạn là có tham chiếu giữa chúng. Tham chiếu này có thể được thiết lập theo một trong hai hướng.

Một khả năng là có ViewControllerA giữ tham chiếu đến ViewControllerB. Thông qua tham chiếu này, ViewControllerA có thể gọi một phương thức trên ViewControllerB khi nút được nhấn mà lấy dữ liệu mà bạn muốn chuyển làm đối số.

class ViewControllerA: UIViewController { 
    @IBOutlet weak var viewControllerB: ViewControllerB! 

    @IBAction func addButton(sender: AnyObject) { 
     self.viewControllerB.showNameLabel(textField.text) 
    } 
} 

Khả năng khác, là sử dụng mẫu đại diện như tiêu đề của bạn gợi ý. Điều này sẽ liên quan đến ViewControllerB có một tham chiếu đến ViewControllerA. Tốt hơn, điều này sẽ không có kiến ​​thức trực tiếp về lớp ViewControllerA, mà thay vào đó là thông qua một giao thức. Giao thức sẽ xác định phương thức mà trả lại dữ liệu bạn muốn "chuyển" cho ViewControllerB. Bằng cách đó, ViewContollerB có thể gọi phương thức giao thức trên "delegate" của nó (đó sẽ là ViewControllerA) để lấy dữ liệu cần thiết.

protocol ViewControllerBDelegate { 
    func requiredText() -> String 
} 

class ViewControllerB: UIViewController { 
    @IBOutlet weak var delegate: ViewControllerBDelegate? 

    override func viewDidLoad() { 
     if let actualDelegate = self.delegate { 
      self.theLabel.text = actualDelegate.requiredText() 
     } 
    } 
} 

Phương pháp bạn chọn thực sự phụ thuộc vào những gì bạn cần trong trường hợp này. Mô hình ủy nhiệm tốt hơn là giữ cho các đối tượng của bạn ít kết hợp với nhau hơn, nhưng nếu bạn đã cần phải "kích hoạt" mọi thứ xảy ra trên ViewControllerB từ ViewControllerA thì phương thức trực tiếp hơn có lẽ là bắt buộc.

+0

Cảm ơn sự giúp đỡ của bạn @drewag! –

+1

Phương thức "trực tiếp" có tạo ra một thể hiện hoàn toàn mới của ViewControllerB không? Ngoài ra, tôi đã phải sử dụng 'var tabbarViewController: TabBarViewController = TabBarViewController()' thay vì cách bạn đặt nó không hoạt động (biến số vẫn là nil) –

+0

@ByronCoetsee & OP, làm sao bạn có bất kỳ tài nguyên nào đi sâu hơn về phương pháp nào để theo đuổi? Khi nào cần khớp nối? vv Cảm ơn! –

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