2016-02-01 15 views
5

Tôi đã tạo một XIB tùy chỉnh mở rộng từ UITableViewHeaderFooterView và cố gắng thêm trình nhận dạng cử chỉ. Chỉ có vấn đề là cố gắng để thêm bộ nhận dạng thông qua kết quả xây dựng giao diện trong đối tượng được bổ sung vào hệ thống phân cấp cấp cao nhất và các lỗi sau gây ứng dụng của tôi để sụp đổ:Thêm UITapGestureRecognizer vào XIB

Chấm dứt ứng dụng do ngoại lệ còn tự do 'NSInternalInconsistencyException', lý do: 'nib không hợp lệ đăng ký định danh (AccordionHeader) - nib phải chứa chính xác một đối tượng cấp cao nhất mà phải là một trường hợp UITableViewHeaderFooterView'

để tốt nhất của kiến ​​thức của tôi không có "viewDidLoad" tương đương có sẵn hoặc tôi sẽ chỉ được thêm trình nhận dạng theo lập trình. Có một cách khác để làm điều này?

Trả lời

0

Bạn nói đúng, trình nhận dạng không được thêm vào XIB ở cấp cao nhất.

Giải pháp của tôi như sau:

class SettingsUserAvatarHeader: UITableViewHeaderFooterView { 

    // Set as a variable, as it will be re-created on cell re-use 
    var tapGestureRecognizer = UITapGestureRecognizer() 

    // This will be called every time the cell moves off screen and returns 
    override func prepareForReuse() { 
     super.prepareForReuse() 

     // Needs to be done manually. 
     tapGestureRecognizer = UITapGestureRecognizer() 
     avatarImageView.gestureRecognizers = [ tapGestureRecognizer ] 
    } 

    // This will be needed for the first display 
    override func didMoveToSuperview() { 
     super.didMoveToSuperview() 

     avatarImageView.gestureRecognizers = [ tapGestureRecognizer ] 
    } 
} 

Với điều này, bạn có thể nghe các vòi trực tiếp. Tôi đang sử dụng RxSwift:

Đầu tiên, thêm một phần mở rộng cho vòi nước:

extension Reactive where Base: SettingsUserAvatarHeader { 

    var avatarTap: ControlEvent<UITapGestureRecognizer> { 
     return self.base.tapGestureRecognizer.rx.event.asControlEvent() 
    } 

} 

Và trong điều khiển của bạn/ủy vv:

class Consumer: UITableViewDelegate { 

    var avatarTapDisposable: Disposable? 

    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
     let cell = tableView.dequeueReusableHeaderFooterView(withIdentifier: "userAvatarView") 
     let view = cell as! SettingsUserAvatarHeader 

     avatarTapDisposable = 
       view.rx 
        .avatarTap 
        .subscribe(onNext: { (tap) in 
         // Here your code for the tap 
        }) 

     return cell 
    } 
} 
Các vấn đề liên quan