2015-07-29 15 views
6

Ok, więc mamy UIScrollView deklarację:nieruchomość Delegat z innego typu w Swift

protocol UIScrollViewDelegate: NSObjectProtocol { ... } 
class UIScrollView: UIView { 
    ... 
    weak var delegate: UIScrollViewDelegate? 
    ... 
} 

A potem UITableView z delegate wariantu?

protocol UITableViewDelegate: NSObjectProtocol, UIScrollViewDelegate { ... } 
class UITableView: UIScrollView { 
    ... 
    weak var delegate: UITableViewDelegate? 
    ... 
} 

W jaki sposób Apple to zrobił? Kiedy robię mój

protocol MyScrollViewSubclassDelegate: NSObjectProtocol, UIScrollViewDelegate { ... } 
class MyScrollViewSubclass: UIScrollView { 
    ... 
    weak var delegate: MyScrollViewSubclassDelegate? 
    ... 
} 

uzyskać Własność „delegata” typu 'MyScrollViewSubclassDelegate? nie można przesłonić właściwości z typem "UIScrollViewDelegate?".

+0

Co, jeśli ustawisz swoją podklasę na UITableView. klasa MyScrollViewSubclass: UITableView – jarryd

+0

Ten sam problem ... –

+0

Czy próbowałeś rozszerzeń protokołu w Swift 2.0? – jarryd

Odpowiedz

2

MyScrollViewSubclass ma właściwość delegata UIScrollView, ponieważ jest to podklasa UIScrollView.

Jako że delegate jest już zdefiniowany przez UIScrollView, nie można zdefiniować tej samej nazwy właściwości z nowym typem.

Zmień nazwę zmiennej delegate na myDelegate (lub coś innego) i powinna działać.

+0

To wszystko, czego potrzebowałem, aby rozwiązać problem. – Fra

3

Natknąłem się na to kilka razy i jedyne obejście, jakie znalazłem, to po prostu wywoływanie mojej własności czymś innym, jak customDelegate lub cokolwiek chcesz.

Byłoby naprawdę fajnie móc po prostu nazwać to delegatem, ale hej!

+0

To samo tutaj. Ale ... dzisiaj zdałem sobie sprawę, że Apple to robi. I jestem bardzo ciekawy jak! –

+0

Czy próbowałeś 'delegowanego (niebezpiecznego) delegata var: MyScrollViewSubclassDelegate?'? To jest to, co widzę w źródle UITableView. – Skoua

+0

Widzę tam "słaby". Albo 'unowned' nie może być zastosowany do typu" MyScrollViewSubclassDelegate "klasy innej niż klasa. –

0

Mam to działa, ale nie bardzo podoba mi się rozwiązanie, ponieważ wyrzuca sprawdzanie typu.

To, co zrobiłem, to było. W mojej klasie bazowej oświadczyłem delegata jako

weak var delegate: AnyObject? = nil 

Wtedy, gdy chcę wywołać metodę na delegata zrobić

if let delegate = self.delegate as? MyBaseClassProtocol { delegate.myMethod() } 

w moim podklasy mogę wtedy też zrobić tego samego rodzaju rzeczy

if let delegate = self.delegate as MySubclassProtocol { delegate.mySubclassMethod() } 

Jak mówię, działa, ale nie podoba mi się to zbytnio. Wyrzucenie kontroli typowej nie jest moim zdaniem łatwe. Dzielę się tylko nadzieją, że ktoś z silniejszymi umiejętnościami Swift może go ulepszyć lub poprawić.

Powiązane problemy