2014-09-08 2 views
30

있는 UIScrollView가 UIScrollViewDelegate에 맞는 위임 속성이재정 대리인 속성이

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? 
    //... 
} 

내가 시도 UICollectionViewDelegate 다른 유형이 속성을 재정의 다음과 같이 내 프로토콜을 사용하여 UIScrollViews 대리자를 재정의합니다.

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

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

} 

컴파일러는 나에게 두 가지 경고를 제공합니다 : '? MyScrollViewDelegate'유형

  • 재산권 '위임' 'UIScrollViewDelegate'유형의 속성을 재정의 할 수 없습니다.
  • '비 소유'는 비 클래스 유형 'MyScrollViewDelegate'에 적용 할 수 없습니다.

UIScrollView의 하위 클래스를 만들고 대리자 속성의 유형을 재정의하려면 (즉, 맞춤 대리인 프로토콜 사용) 어떻게 할 수 있습니까?

답변

16

상속 된 속성을 재정의하는 것이 Objective-C에서는 가능하지만 Swift에서는 (적어도 현재는) 불가능하다고 생각합니다. 나는이 문제를 처리 한 방법은 얻는 올바른 유형의 계산 된 속성으로 별도의 대리자를 선언하고 실제 위임 설정 : 정상적으로 스크롤 뷰 대리자를 호출 작동

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

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

이 방법은 아무것도 , 당신은 다음과 같이 self.myDelegate에 특정 대리자 메서드를 호출 할 수

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

이 빠른 2.1에서 작동하지 않습니다,이 방법에 대한 업데이 트를하는 데 도움이? –

0

할 수 있습니다 무시할 수와 같은 선언 함수 방법을 설정 :

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

신속한 컴파일러 Objective-c와 같은 메소드 속성.

+0

이것은 나를 위해 작동하지 않았다. 나는 순수 Swift 앱을 가지고있다.이 세터 메소드를'UITextView'의 서브 클래스에 추가 한 후에 델리게이트 (뷰 컨트롤러)에서 myTextView.delegate = self를 실행하면 내가 추가 한 세터 메소드가 호출되지 않았습니다. 나는 getter 방법을 시도하지 않았다. – ma11hew28

2

내가 선호하는 방법은 개인적으로 scrollviews를 직접 하위 클래스로 만들지 않고 별도의 scrollview에 대한 대리자를 포함하고 UIView 하위 클래스의 자체 대리자에게 scrollview의 대리자 메시지를 전달하는 것입니다. 또한 스크롤 뷰로 정의 된 영역 외부에 사용자 정의 컨트롤을 추가 할 수 있습니다. 직접적인 서브 클래스에 비해 조금 비 효과적으로 보일지 모르지만 적어도 불쾌한 해킹은 피할 수 있습니다.

+0

좀 더 설명력이 좋거나 코드를 올리시겠습니까?,이게 재미있어 보이네요 ... –

3

다음은 Swift에서 재정의 속성 유형을 변경하기위한 솔루션입니다. 델리게이트의 프로토콜을 확장해야 할 때 특히 유용합니다.

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

이 기능은 Swift 버전 1.2에서 작동합니다. 나는 그것이 도움이되기를 바랍니다.

2

당신은 다음과 같이 수행 할 수 있습니다

protocol ExtendedUIScrollViewDelegate: UIScrollViewDelegate { 
    func someNewFunction() 
} 

class CustomScrollView: UIScrollView { 

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

희망이