2017-06-04 38 views
0

誰能幫我給的理由使用委託/協議定向或獲得上海華,因爲我知道迅速使用協議的面向上的代碼,但爲搶父視圖或控制器,我們仍然可以使用獲得上海華像什麼是最好的代表或獲得超視圖?

獲得上海華例子:

extension UIView { 

    var parentViewController: UIViewController? { 
    var parentResponder: UIResponder? = self 
    while parentResponder != nil { 
     parentResponder = parentResponder!.next 
     if let viewController = parentResponder as? UIViewController { 
      return viewController 
     } 
    } 
    return nil 
    } 
} 

使用委託例如:

protocol SomeDelegate { 
    func didClick() 
} 

class Child { 
    var delegate: SomeDelegate? 
} 

什麼優點和缺點使用委託或獲得超視圖?

爲parentView

實施例:

class Cell { 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    self.parentViewController.view.makeToast("Something !") 
    } 
} 

示例委託:

class Parent: SomeDelegate { 
    func didClick() { 
    self.view.makeToast("Something !") 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableview.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? Cell 
    cell.delegate = self 

    return cell 
    } 
} 

class Cell { 
    var label: UILabel 
    var delegate: SomeDelegate? 

    func configure() { 
    label.addGestureRecognizer(UILongPressGestureRecognizer(
     target: self, 
     action: #selector(copyAction(_:)) 
    )) 
    } 

    @objc private func copyAction(_ sender: UILongPressGestureRecognizer) { 
    guard let delegate = self.delegate else { 
     return 
    } 

    delegate.didClick() 
    } 
} 
+1

你的問題沒有意義,因爲委託模式和「獲取超級視圖」是*不是同一件事情。有很多時候你想要的'.superview'屬性與代表無關,並且有很多次使用與superviews無關的代表。跳到蘋果的開發者網站並閱讀它。 – DonMag

+0

@DonMag我更新了這個問題現在沒有意義嗎? – alpiopio

+0

不,因爲它們仍然是根本不同的任務。可能在某種情況下,您正在考慮您將使用的代表也是超級視圖。但這不是一般情況。當你需要用superview做某些事情時,通常會找到超級視圖,而不管該對象是什麼。無論對象在哪裏,您都可以在使用委託對象時使用委託。 – Paulw11

回答

0

代表是優選的,而不是上海華。以下某些原因

  1. 添加到堆棧中的視圖在添加後並不總是保留在內存中。特別是當沒有強有力的參考資料時(這在XIB或SB添加視圖時會有所不同)。所以在這種情況下,調用superview可能會在某些隨機實例上發送無法識別的選擇器時崩潰。
  2. 人們可以創建一個視圖,永遠不會添加到另一個視圖。爲了刪除你可能會評論只是addsubview行離開其他代碼的原因。在這個時候,超級觀點是零。
  3. 在uicontrols下自定義視圖的使用與像CollectionView,TableView等自己的可重用視圖堆棧會改變運行時的超級視圖。所以並不總是保證調用相同的superview實例。
相關問題