私は、プロトコルによる委任がどのように機能するかを学ぼうとしています。私はすべてを理解しましたが、テーブルビューとスクロールビューを使用する場合を除いて、いつ委任を使用するかを考えることはできません。
一般に、委任はいつ使用されますか?
まず、 委任パターン はiOSの世界専用ではないことを知っておく必要があります。
ソフトウェアエンジニアリングでは、委任パターンはオブジェクト指向プログラミングの設計パターンであり、オブジェクト構成が継承と同じコードの再利用を実現できるようにします。
しかし、 iOSの世界の委任 での作業は非常に一般的であり、使用されたインスタンスにプロパティまたは動作を提供する機能を提供するための委任/データソースを提供するクラスの多くを見ることができると思います。これは、CocoaTouchでオブジェクトが相互に通信する方法の主要なメカニズムの1つです。
ただし、委任はnotであり、iOSでオブジェクトが相互に通信できるようにする唯一の方法です。
Remark:それらを比較することに興味がある場合は、次の記事を確認してください:
したがって、質問は次のとおりです。「なぜこれらのオプションの代わりに委任を使用する必要があるのですか?」
私はそれを簡単にしようとします。 one to one 2つのオブジェクト間の関係がある場合、委任の使用をお勧めします。わかりやすくするために、NotificationCenterについて少し話すことのgoalは、委任が使用される場合に意味をなそうとすることです。
NotificationCenterはone to many関係を表します。単に、それは次のように機能します:特定のイベントに関する通知の投稿(通知)およびこの通知の監視(通知を受ける)観測anywhereelse;論理的には、それが1対多の関係の意味です。これは Observer Pattern の表現です。
簡略化するために、手順として以下に言及します。
要件の把握:各デリゲートには、独自のルールがあり、メソッドシグネチャのセットであるdelegate protocolにリストされていますこの委任を順守するために実装する必要があります。
委任に適合:それは、クラスにマークを付けることで、単にクラスを委任者にすることです。例えば: class ViewController: UIViewController, UITableViewDelegate {}
。
デリゲートオブジェクトの接続:クラスをデリゲートとしてマークするだけではnotで十分であるため、クラスで確認するオブジェクトを確認する必要があります。必要な仕事をクラスに与えます。
要件の実装:最後に、クラスはデリゲートプロトコルにリストされているすべての必須メソッドを実装する必要があります。
少し混乱するように聞こえますか?実世界の例はどうですか?
次のシナリオを検討してください。
オーディオの再生に関連するアプリケーションを構築していると想像してください。一部のviewControllersには、オーディオプレーヤーのビューが必要です。最も単純なケースでは、再生/一時停止ボタンと、どのように見えるかに関係なく、何らかの方法でプレイリストを表示するための別のボタンが必要であると想定しています。
これまでのところ、オーディオプレーヤービューにはUIView
クラスと.xib
ファイル;必要なviewControllerのサブビューとして追加する必要があります。
さて、どのようにして各viewControllerの両方のボタンに機能を追加できますか? 「単純に、ビュークラスにIBAction
を追加するだけです」と思われるかもしれませんが、最初は大丈夫に聞こえるかもしれませんが、少し考え直してみると、コントローラー層でボタンをタップするイベントを処理しようとしている場合は適用されません。わかりやすくするために、オーディオプレーヤービューのボタンをタップするときに各viewControllerに異なる機能が実装されている場合はどうでしょうか。たとえば、「A」viewControllerでプレイリストをタップするとtableViewが表示されますが、「B」viewControllerでタップするとピッカーが表示されます。
さて、この問題にDelegationを適用しましょう:
「#」コメントは、「委任を適用する方法」の手順を表します。セクション。
オーディオプレーヤービュー:
// # 1: here is the protocol for creating the delegation
protocol AudioPlayerDelegate: class {
func playPauseDidTap()
func playlistDidTap()
}
class AudioPlayerView: UIView {
//MARK:- IBOutlets
@IBOutlet weak private var btnPlayPause: UIButton!
@IBOutlet weak private var btnPlaylist: UIButton!
// MARK:- Delegate
weak var delegate: AudioPlayerDelegate?
// IBActions
@IBAction private func playPauseTapped(_ sender: AnyObject) {
delegate?.playPauseDidTap()
}
@IBAction private func playlistTapped(_ sender: AnyObject) {
delegate?.playlistDidTap()
}
}
View Controller:
class ViewController: UIViewController {
var audioPlayer: AudioPlayerView?
// MARK:- Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
audioPlayer = AudioPlayerView()
// # 3: the "AudioPlayerView" instance delegate will implemented by my class "ViewController"
audioPlayer?.delegate = self
}
}
// # 2: "ViewController" will implement "AudioPlayerDelegate":
extension ViewController: AudioPlayerDelegate {
// # 4: "ViewController" implements "AudioPlayerDelegate" requirments:
func playPauseDidTap() {
print("play/pause tapped!!")
}
func playlistDidTap() {
// note that is should do a different behavior in each viewController...
print("list tapped!!")
}
}
クイックヒント:
委任を使用するmost人気の例の1つは、View Controller間の Passing Data Back です。
委任は、オブジェクトAの情報または状態を別のオブジェクトBに渡す場合に使用されます。通常、オブジェクトBは、オブジェクトAを作成したオブジェクトです。
委任を使用するいくつかの状況をリストします。
はい、あなたが正しい。テーブルビューとスクロールビューは、「誰かが行を選択した!」と興味がある人(通常はView Controller)に伝えたいため、デリゲートを使用します。または「誰かがスクロールビューをスクロールしました!」。スクロールビューとテーブルビューはデリゲートを使用するだけでなく、UITextField
とUIDatePicker
をはじめ、他の多くのビューもデリゲートを使用します。
View Controllerにもデリゲートがあります。たとえば、UIImagePickerController
。理由は上記とほぼ同じです-UIImagePickerController
は「画像が選択されました!」のようなメッセージを伝えたいからです。別の例はUIPopoverControllerDelegate
です。このデリゲートは、「ポップオーバーが却下されました!」などのことを伝えます。
デリゲートを使用する他のクラスには、CLLocationManager
が含まれます。このデリゲートは、「ユーザーの位置が検出された」または「ユーザーの位置を検出できなかった」などのことを通知します。
特定のView Controllerが他のView Controllerにメッセージを送信する場合、コードで委任を使用できます。設定ビューコントローラの場合、「フォントサイズ設定が変更されました!」などのメッセージを送信する場合がありますまた、フォントサイズ設定の変更を考慮するView Controllerは、ラベルなどのフォントサイズを認識して変更します。
IOS worldおよびほとんどのMVC(Model View Controller)での委任は、ViewがControllerと通信する方法であり、「ブラインドコミュニケーション」と呼ばれ、委任は「リーディングスティック」を与えることを意味します。ビューがそれ自体では制御できないコンポーネントを制御するために別のオブジェクト(実際には誰が引き継ぐかは通常気にしませんが、通常はコントローラーです)またはビューをより単純にするために所有しません。 ..
コントローラーはビューと通信できますが、ビューは委任なしではコントローラーと通信できません