2014-09-08 35 views
30

UIScrollView UIScrollViewDelegate uyan bir temsilci özelliğine sahiptirgeçersiz kılma temsilci özelliği

protocol UIScrollViewDelegate : NSObjectProtocol { 
    //... 
} 
class UIScrollView : UIView, NSCoding { 
    unowned(unsafe) var delegate: UIScrollViewDelegate? 
    //... 
} 

UICollectionView

protocol UICollectionViewDelegate : UIScrollViewDelegate, NSObjectProtocol { 
    //... 
} 

class UICollectionView : UIScrollView { 
    unowned(unsafe) var delegate: UICollectionViewDelegate? 
    //... 
} 

denemek UICollectionViewDelegate farklı türü ile bu özelliği geçersiz kılar şöyle benim protokol ile UIScrollViews temsilci geçersiz kılmak için:

protocol MyScrollViewDelegate : UIScrollViewDelegate, NSObjectProtocol { 
    //... 
} 

class MyScrollView: UIScrollView { 
    unowned(unsafe) var delegate: MyScrollViewDelegate? 

} 

derleyici bana iki uyarı verir: 'MyScrollViewDelegate' türü ile

  • Property 'temsilci' 'UIScrollViewDelegate?' türünde bir özelliği geçersiz kılabilir
  • 'Unutulmaz' sınıf dışı türlere uygulanamaz 'MyScrollViewDelegate?'

UIScrollView alt sınıfını nasıl sınıflandırabilir ve temsilci özelliği türünü geçersiz kılabilir (örn. Özel bir temsilci protokolü kullanabilir)?

cevap

16

Ben Kalıtsal özelliği geçersiz kılma Swift de Objective-C mümkün olan bir şey değil (en azından şu anda) olduğunu düşünüyorum. Ben bu ele ettik yolu alır Doğru türde bir bilgisayarlı özelliği olarak ayrı bir temsilci ilan etmek ve gerçek temsilci ayarlar: hala normal kaydırma görünümü temsilci çağırır çalışır

@objc protocol MyScrollViewDelegate : UIScrollViewDelegate, NSObjectProtocol { 
    func myHeight() -> CGFloat 
    // ... 
} 

class MyScrollView: UIScrollView { 
    var myDelegate: MyScrollViewDelegate? { 
     get { return self.delegate as? MyScrollViewDelegate } 
     set { self.delegate = newValue } 
    } 
} 

Bu şekilde bir şey ve bu gibi self.myDelegate üzerinde belirli temsilci yöntemleri çağırabilir:

if let height = self.myDelegate?.myHeight() { 
    // ... 
} 
+1

Bu hızlı 2.1 çalışmıyor, bu yaklaşıma herhangi bir güncelleme olur? –

0

yapabilirsiniz geçersiz olsun ve benzeri beyan işlevi tarafından yöntemini ayarlayın:

func setDelegate(delegate:UITableViewDelegate?){ 
    self.delegateInterceptor = delegate; 
} 

hızlı derleyici özelliği Objective-c'nin yaptığı yönteme dönüştürür.

+0

Bu benim için çalışmadı. Saf Swift uygulaması var.Bu setter metodunu 'UITextView' alt sınıfına ekledikten sonra,' myTextView.delegate = self' delege (view controller'ım) yapıp eklediğim setter metodunu çağırmadı. Getter yöntemini denemedim. – ma11hew28

2

Tercih edilen yöntemim, kişisel olarak kaydırma görünümlerini doğrudan alt sınıflara ayırmak değil, ayrı bir kaydırma görünümü için temsilci olarak bir UIView alt sınıfı oluşturmak ve sonra da bu kaydırma görüşünün temsilci iletilerini gerektiğinde UIView alt sınıfının kendi temsilcisine iletmektir. Bu ayrıca, kaydırma görünümü tarafından tanımlanan alan dışındaki özel denetimlerin eklenmesini de sağlar. Doğrudan bir alt sınıfa kıyasla biraz daha temkinli görünebilir, ancak en azından hoş olmayan hacklerden kaçınır.

+0

Lütfen daha açıklayıcı olabilir misiniz, yoksa kod yazabilir misiniz? –

3

Swift'deki geçersiz kılma özelliklerinin türünü değiştirmek için bir çözüm. Delegelerin protokollerini genişletmeniz gerektiğinde özellikle kullanışlıdır.

@objc protocol ExtendedUIScrollViewDelegate: UIScrollViewDelegate { 
    func someNewFunction() 
} 

class CustomScrollView: UIScrollView { 

    weak var delegateInterceptor: ExtendedScrollViewDelegate? 
    override var delegate: UIScrollViewDelegate! { 
     didSet { 
      if let newValue = delegate { 
       let castedDelegate = unsafeBitCast(delegate, ExtendedScrollViewDelegate.self) 
       delegateInterceptor = castedDelegate 
      } 
      else { 
       delegateInterceptor = nil 
      } 
     } 
    } 
} 

Bu, Swift sürüm 1.2 ile test edildiği şekilde çalışır. Umut ediyorum bu yardım eder.

2

Böyle yapabilirsiniz:

protocol ExtendedUIScrollViewDelegate: UIScrollViewDelegate { 
    func someNewFunction() 
} 

class CustomScrollView: UIScrollView { 

    weak var myDelegate: ExtendedScrollViewDelegate? 
    override weak var delegate: UIScrollViewDelegate? { 
     didSet { 
      myDelegate = delegate as? ExtendedScrollViewDelegate 
     } 
    } 
} 

Umut bu