2015-11-19 14 views
6

Tôi đã tạo một lớp "DeletableImageView" (.swift + .xib) sử dụng giao thức mà tôi đã định nghĩa là "DeletableImageViewDelegate" thông qua thuộc tính mà tôi gọi là delegate.Cách kết nối đại biểu từ lớp tùy chỉnh trong xib?

Ví dụ vì lợi ích của sự rõ ràng:

DeletableImageView.swift

protocol DeletableImageViewDelegate { 
    func deleteImageWithTag(tag: Int!) -> (Bool) 
    func addImageOnViewWithTag(tag: Int!) -> (Bool) 
    ... 
} 

class DeletableImageView: UIView { 

    var view: UIView! 
    var delegate: DeletableImageViewDelegate? 

    // Some random methods + some use of the delegate protocol's methods 
    ... 
} 

Vấn đề của tôi là bây giờ, khi tôi cố gắng sử dụng lớp học của tôi trong một bộ điều khiển từ tập tin liên quan đến .xib (mà có nghĩa là tôi kéo và thả một khung nhìn trong trình xây dựng giao diện và gán lớp DeletableImageView cho khung nhìn này) Tôi không thể liên kết thuộc tính ủy nhiệm (ngay cả khi tôi khai báo thuộc tính này dưới dạng IBOutlet).

Những gì tôi muốn để có thể làm là để trực tiếp liên kết ổ cắm đại biểu của quan điểm với "Chủ đầu tư tập" trong .xib

Điều chính xác tương tự như bạn làm gì khi bạn liên kết nguồn dữ liệu và đại biểu từ một tableview trực tiếp trong tập tin .xib.

Nhưng khi tôi kiểm soát việc kéo chúng sẽ không liên kết với nhau.

Có ai có ý tưởng gì về những gì đang xảy ra không?

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

+0

Chủ sở hữu tệp có tuân thủ giao thức không? – luk2302

+0

Có chủ sở hữu tệp tuân theo giao thức ... –

+0

Đây là video tôi đã thực hiện để giúp bạn hiểu vấn đề của tôi: https: // youtu.be/clYFj6dkaWk –

Trả lời

1

Điều đầu tiên bạn cần làm là thêm @objc từ định nghĩa giao thức của bạn, để nó trông giống như:

@objc protocol DeletableImageViewDelegate { 
    ... 
} 

Bạn có thể hỏi tại sao bạn cần phải làm điều này. Đó là vì bạn muốn thêm thuộc tính ủy quyền vào bảng phân cảnh và để đặt một số thuộc tính hiển thị theo bảng phân cảnh, nó phải có tiền tố @IBOutlet và tiền tố đó yêu cầu nó là giao thức Objective C.

Vì vậy, điều tiếp theo bạn muốn làm là thay đổi var delegate: DeletableImageViewDelegate? để

@IBOutlet var delegate: DeletableImageViewDelegate? 

Bây giờ nếu bạn nhấp chuột phải trên quan điểm trong xây dựng giao diện bạn sẽ nhận được một cái gì đó như thế này, có nghĩa là chúng ta tiếp xúc với bất động sản đại biểu của chúng tôi đến trình tạo giao diện. Exposed property

Nếu bạn cố gắng kết nối với chủ sở hữu tệp (ví dụ UIViewController), nó sẽ không hoạt động vì chủ sở hữu tệp của bạn vẫn không triển khai giao thức đó. Để thực hiện nó, bạn cần phải viết:

extension UIViewController : DeletableImageViewDelegate { 
    // Implementation 
} 

Sau khi bạn làm điều đó, bạn sẽ có thể kết nối thuộc tính đại biểu với bộ điều khiển chế độ xem, do đó nhận được thông báo phương thức đại biểu. Trong mỗi trường hợp, chủ sở hữu tệp của bạn phải triển khai giao thức.

+0

Tôi đã thử nó nhưng nó vẫn không hoạt động, tôi bắt đầu tự hỏi nếu điều này có thể là một lỗi của XCode gây ra phiên bản mới có rất nhiều vấn đề với .xib (s) của tôi hoặc có thể nó juste trên mac của tôi. .. Bạn vẫn không thể liên kết chế độ xem với tệp ower ... Tôi muốn chính xác rằng tôi KHÔNG SỬ DỤNG CÂU CHUYỆN !!! **, có thể đây là lý do khiến nó không hoạt động? –

+0

Đây là video tôi đã thực hiện để giúp bạn hiểu vấn đề của mình: https://youtu.be/clYFj6dkaWk –

+0

Bây giờ tôi thấy rằng chế độ xem có thể xóa của bạn là chế độ xem phụ của chế độ xem chính trong xib. Thêm phần mở rộng vào 'UIView' và bạn nên làm tốt. –

0

Tôi đã tạo giải pháp tương tự như trong các nhận xét. Nhưng tôi cũng không muốn phải ủy nhiệm đại biểu mỗi lần và kiểm tra việc thực hiện giao thức.

weak var delegate: MenuViewDelegate? 
@IBOutlet weak var _delegate: AnyObject? { 
    didSet { 
     if let d = _delegate { 
      if let d = (d as? MenuViewDelegate) { 
       delegate = d 
      } else { 
       print("ERROR: delegate does not implement \(d) MenuViewDelegate protocol") 

       d as! MenuViewDelegate 
      } 
     } 
    } 
} 
Các vấn đề liên quan