2016-12-28 18 views
1

クラス内の変数の動作を変更しようとしています。クラス内の変数のサブクラス化

もっと正確に言えば、私は 'scrollview'プロパティを持つ 'UIWebView'を持っています。

このスクロールビューの 'setContentInset'をオーバーライドする必要がありますが、これを行う方法がわかりません。

var scrollView: UIScrollView { get } 

だから私は単に私自身を作成することはできませんし、そこにそれを設定します。

ドキュメントはのUIWebViewがこれを持っている私を見ます。

私の質問は、UIWebViewのスクロールビューから 'setContentInset'をオーバーライドする方法です。

編集:

2明確化。

私は、ドキュメントのsubclassing notesに従って、UIWebViewはサブクラス化されていないと知っています。

私の目標は、アプリの他のスクロールビューにすでに実装しているthis answerのように、「プルダウンするように更新する」不具合を修正することです。

+0

'UIScrollViewDelegate'プロトコルを拡張してデリゲートメソッド' scrollViewDidSetContentInset(UIScrollView) 'を追加し、' contentInset(UIScrollView) 'が呼び出されるたびに' UIScrollView'を呼び出すように拡張することをお勧めします。 'が設定されます。 – Robert

答えて

0

組み込みのインターフェイスクラスに別のビルトインインターフェイスクラスがある場合、その内部クラスをサブクラス化することも、それを上書きすることもできません。

したがって、UIWebViewをサブクラス化することはできますが、何らかの形でUIWebViewのスクロールビューをサブクラス化することはできません。

もう1つのよく知られた例はUIButtonです。誰もが、UIButtonにUILabelとUIImageViewが含まれていることを知っています。 UIButtonをサブクラス化することはできますが、そのUILabelまたはUIImageViewをサブクラス化することはできません。

+0

'UIButton'の' titleLabel'と 'imageView'をオーバーライドするのは難しいでしょうが、これはボタンの状態が違うからです。 'textLabel'と' imageView'の両方を 'UITableViewCell'のサブクラスでオーバーライドしました。 'scrollView'をオーバーライドするときにどんな問題がありますか? –

0

私は単純なアプローチから始め、微妙な問題がないかどうかを確認します。

class MyScrollView: UIScrollView { 
    private lazy var my_contentInset: UIEdgeInsets = UIEdgeInsets() 
    override var contentInset: UIEdgeInsets { 
     get { return my_contentInset } 
     set { 
      // Your willSet code 
      my_contentInset = newValue 
      // Your didSet code 
     } 
    } 
} 

class MyWebView: UIWebView { 
    private lazy var my_scrollView: MyScrollView = MyScrollView() 
    override var scrollView: UIScrollView { 
     get { return my_scrollView } 
    } 
} 

これは少し単純化され、あなたはランタイムがscrollViewを設定する方法によっては問題に実行します。実行時にscrollViewの設定が必要な場合は、さらに深くする必要があります。

ここでは、UIScrollViewをクローンし、セッターでそれをMyWebViewscrollViewに使用するスクロールビュー用のイニシャライザを作成します。

extension MyScrollView { 
    convenience init(scrollView: UIScrollView) { 
     let data = NSKeyedArchiver.archivedData(withRootObject: scrollView) 
     let coder = NSKeyedUnarchiver(forReadingWith: data) 
     self.init(coder: coder)! // Intentionally failing hard on decode failure. 

     // Additional configuration not captured in the encode/decode 
     // process might be needed. 
    } 
} 

class MyWebView: UIWebView { 
    private lazy var my_scrollView: MyScrollView = MyScrollView() 
    override var scrollView: UIScrollView { 
     get { return my_scrollView } 
     set { my_scrollView = MyScrollView(scrollView: newValue) } 
    } 
} 

でもこれでは不十分かもしれません。ランタイムは、内部オブジェクトを扱うときに、多くの方法で不正行為をすることがあります。それはあなたを始めさせるのに十分であるはずです。

関連する問題