2015-07-04 17 views
5

giao thức đại biểu của tôi không bao giờ gọi

điều khiển đầu tiên của tôi - ViewControllerđại biểu nhanh chóng beetween hai bộ điều khiển xem mà không segue

class ViewController: UIViewController,testProtocol { 

    @IBAction func btInit(sender: AnyObject) { 
     println("Bt Init") 

     let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
     let initViewController: UIViewController = storyBoard.instantiateViewControllerWithIdentifier("viewTarget") as targetViewController 
     self.presentViewController(initViewController,animated: false, nil) 

    } 

    var targetController = targetViewController(); 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.targetController.delegate = self 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func testDelegate(){ 
     println(" in my view controller delegate ") 
    } 
} 

Trong điều khiển xem thứ hai của tôi - targetViewController

protocol testProtocol { 
    func testDelegate() // this function the first controllers 
} 

class targetViewController: UIViewController { 

    @IBAction func BtTarget(sender: AnyObject) { 

     println("bt target pressed") 

     delegate?.testDelegate() 
    } 

    var delegate : testProtocol? 

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

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

    func testDelegate(){ 
     println(" in my target view controller delegate ") 
    } 
} 

Tại sao testDelegate () không bao giờ được gọi trên ViewController? Tôi đang làm gì sai? Cảm ơn.

Tôi đã đọc rất nhiều bài viết về điều này, nhưng tất cả các ví dụ được đưa ra với chuyển tiếp segue, và tôi không muốn sử dụng một segue.

Trả lời

11

Thông thường bạn đặt thuộc tính đại biểu của bộ điều khiển chế độ xem mới trong prepareForSegue:. Bạn nói rằng bạn không sử dụng một segue, vì vậy bạn sẽ cần phải nhanh chóng điều khiển xem thứ hai và trình bày nó bằng cách nào đó. Bạn có thể làm điều này bằng cách làm một cái gì đó như:

let storyboard = UIStoryboard(name: "AStoryboardName", bundle: nil) 
let secondVC = storyboard.instantiateViewControllerWithIdentifier(anIdentifier) as! targetViewController 
secondVC.delegate = self 
presentViewController(secondVC, animated: true, completion: nil) 

bạn có một phương pháp testDelegate() trong cả xem bộ điều khiển, nhưng bạn chỉ muốn nó trong bộ điều khiển nhìn đầu tiên. Sau đó, bộ điều khiển xem thứ hai của bạn có thể gọi delegate?.testDelegate() vào thời điểm thích hợp.

Cuối cùng, bạn thường muốn làm cho tính chất đại biểu yếu, vì vậy tôi muốn giới thiệu thay đổi var delegate : testProtocol?-weak var delegate: testProtocol?

tôi sẽ đọc lên trên đoàn. Dưới đây là một quá trình 5 bước tương đối đơn giản để đoàn có thể giúp bạn:

Phái đoàn trong 5 bước:

đối tượng A là đại biểu cho đối tượng B, và đối tượng B sẽ gửi các thông điệp:

  1. Xác định giao thức đại biểu cho đối tượng B.
  2. Cung cấp cho đối tượng B một biến đại biểu tùy chọn. Biến này phải yếu.
  3. Làm cho đối tượng B gửi tin nhắn cho đại biểu của mình khi có điều gì đó thú vị xảy ra, chẳng hạn như người dùng nhấn nút Hủy hoặc Xong hoặc khi cần một thông tin.
  4. Tạo đối tượng A tuân theo giao thức đại biểu. Nó sẽ đặt tên của giao thức trong dòng lớp của nó và thực hiện các phương thức từ giao thức.
  5. Cho đối tượng B biết đối tượng A hiện là đại diện của nó (trong preparForSegue (người gửi)).
+0

cảm ơn, nó phù hợp với tôi. – user2718075

+0

@ user2718075 Tuyệt vời, rất vui khi được nghe! – trevorj

+0

@trevorj cũng đã làm việc cho tôi. Cảm ơn! – iRiziya

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