2016-12-28 58 views
1

我試圖改變一個類中變量的行爲。在一個類中創建一個變量

更確切地說,我有一個'UIWebView',它具有'scrollview'屬性。

我需要覆蓋此滾動視圖的'setContentInset',但我不知道如何做到這一點。

的文檔給我一個UIWebView有這樣的:

var scrollView: UIScrollView { get } 

所以我不能簡單地創建自己的,並設置它。

我的問題是,如何從UIWebView的滾動視圖重寫'setContentInset'?

編輯:

2澄清。

我知道UIWebView不應該被分類,根據文檔的subclassing notes

我的目標是修復在我的應用的其他滾動視圖中已實施的this answer之後的「下拉刷新」跳動行爲。

+0

我不知道你是否可以實現你想要的,但作爲一種解決方法,考慮擴展'UIScrollViewDelegate'協議以添加委託方法'scrollViewDidSetContentInset(UIScrollView)',然後擴展'UIScrollView'以在contentInset '設置。 – Robert

回答

0

當內置接口類「擁有」另一個內置接口類時,您不能繼承內部類或覆蓋任何關於它的內容。

因此,雖然您可以繼承UIWebView,但您不能以某種方式子類化UIWebView的滾動視圖。

另一個熟悉的例子是UIButton。大家都知道,UIButton包含一個UILabel和一個UIImageView。您可以繼承UIButton,但不能繼承其UILabel或UIImageView。

+0

重寫'UIButton'的'titleLabel'和'imageView'會很棘手,但這是因爲按鈕狀態不同。我已經在'UITableViewCell'的子類中成功覆蓋了'textLabel'和'imageView'。重寫'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的setter,那麼您需要更深入。

這裏我爲我的滾動視圖創建了一個初始化程序,它克隆了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) } 
    } 
} 

即使這可能還不夠。處理內部對象時,運行時可能會以各種方式作弊。它應該足以讓你開始。

相關問題