2017-06-04 1 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'プロパティはデリゲートとは何の関係もなく、スーパービューとは何の関係もないデリゲートを使う時間がたくさんあります。アップルの開発者サイトに移動し、それを読んでください。 – DonMag

+0

@DonMag今私は質問をしましたか? – alpiopio

+0

いいえ、それらは基本的には異なるタスクです。あなたが使用するデリゲートがスーパービューであると考える場合もあります。しかし、これは一般的なケースではありません。そのオブジェクトが何であるかにかかわらず、スーパービューで何かをする必要があるときは、通常、スーパービューを見つけるでしょう。そのオブジェクトがどこにあるかにかかわらず、デリゲートオブジェクトを使用する場合は、デリゲートを使用します。 – Paulw11

答えて

0

委任はスーパー、ないことが好ましいです。いくつかの理由があります

  1. 追加されたビューは、追加された後も必ずしもメモリに保持されません。特に強い参照が維持されていない場合(これは、XIBまたはSBからビューを追加した場合とは異なります)。したがって、この場合、スーパービューを呼び出すと、無作為のインスタンスで送信された認識できないセレクタでクラッシュすることがあります。
  2. ビューを作成して別のビューに追加することはできません。別のコードをそのまま残して、addsubview行だけをコメントするかもしれません。この時点でスーパービューもゼロです。
  3. Collectionview、TableViewなどの再利用可能なビュースタックを持つuicontrolsでカスタムビューを使用すると、実行時にスーパービューが変更されます。常に同じsuperviewインスタンスを呼び出すことは保証されません。