2016-02-01 15 views
5

UITableViewHeaderFooterView öğesinden uzanan ve bir jest tanıyıcı eklemeye çalışan özel bir XIB oluşturdum. Tek sorun üst düzey hiyerarşiye eklenmektedir nesnede arayüz oluşturucu sonuçları yoluyla tanıyıcıyı eklemeye çalışıyor ve aşağıdaki hata kazasında benim app neden: nedeniyle akıl yakalanmamış istisna 'NSInternalInconsistencyException' içinUITapGestureRecognizer öğesini XIB'ye ekleme

app Sonlandırma: hayır "viewDidLoad" eşdeğer kullanılabilir ya da sadece ekleyerek olurdu orada benim kadarıyla

- 'tanımlayıcı (AccordionHeader) kayıtlı geçersiz ucu ucu bir UITableViewHeaderFooterView örneği olmalı tam olarak bir üst düzey nesne içermelidir' tanıyıcı programatik olarak. Bunu yapmanın başka bir yolu var mı?

cevap

0

Haklısınız, tanıyıcı en üst düzeydeki XIB'ye eklenmemelidir.

Çözümümün şöyle: Bununla

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 ] 
    } 
} 

doğrudan musluklar dinleyebilirsiniz. Ben RxSwift kullanıyorum:

Birincisi, musluğu için bir uzantı eklemek:

extension Reactive where Base: SettingsUserAvatarHeader { 

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

} 

Ve denetleyicisi/temsilci vb:

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 
    } 
} 
İlgili konular