0

私は数日間ビューコントローラーを見てきました(xcodeヘルプ、グーグル、スタックオーバーフローを検索しています)。理解できないコードがあります。ここに、読んでいる本で見つけた次のコードがありますが、正しく理解できているかどうかはわかりません。

-(void)prepareForSegue(UIStoryboardsegue *)segue sender:(id)sender{
    ((ViewController2 *)segue.destinationViewController).delegate = self;
}

まず、ここで 2 番目のビュー コントローラー (viewController2) に型キャストする理由がわかりません。残りはわかると思いますが、メソッドのセグエ パラメータ (セグエに関与するビュー コントローラに関する情報を保持します) を取得し、destinationViewController にアクセスします (つまり、目的のビュー コントローラにアクセスしたいということです)。次に、宛先ビュー コントローラーのデリゲート プロパティを self に設定します。目的のView Controllerでデリゲートにメッセージを送信したいので、デリゲートプロパティをselfに設定したと思います。

私が得られない最後のものは次のとおりです。

ヘッダー ファイル内:

@property (weak, nonatomic)id delegate;

実装ファイル内: (controllerVisisble プロパティはブール値であり、ユーザーがボタンを押して 2 番目のビュー コントローラー (このコントローラー) への手動セグエを実行すると、YES に変更されます)

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    ((ViewController *)self.delegate).controllerrVisisble=NO;
}

ビューが閉じたり削除されたりすると、viewWillDisappear メソッドが呼び出されます。

[super viewWillDisappear:animated] についてはよくわかりませんが、ビューが消えるときにアニメーションが表示されるのではないかと推測しています。 .

ここが本当に私を混乱させる部分です。最初のView ControllerのdateChooserVisibleプロパティに何らかの方法でアクセスしてNOに設定し、ボタンから2番目のView Controllerに再度アクセスできるようにする必要があります。しかし、型キャスト (viewController *) して、self.delegate を入力しなければならない理由がわかりません。また、ここで使用するために、ヘッダー ファイルにデリゲートというプロパティを作成した理由もわかりません。

4

1 に答える 1

0

これらの質問の多くは、View Controller のコンテキスト内だけではなく、より一般的なものです。

  • [super methodName]methodName という名前のメソッドのスーパークラス実装を呼び出します。viewWillDisappear:あなたの場合、Apple は UIViewController のメソッドに (私たちがアクセスできない) いくつかのコードを書きました。スーパークラスのメソッドをオーバーライドするときは、必ず super を呼び出してください。

  • viewWillDisappear:ビューが消えるように設定されているときはいつでもコールバックがトリガーされることに注意してください。私の推測では、このメソッドのスーパー実装は、このコールバックを子ビュー コントローラーに転送します。特に、UINavigationControllerや などの標準コンテナー クラスの場合ですUITabBarController

  • 型キャストは実際には必要ないようです。レシーバーが型であるかid、呼び出されたメソッドの宣言を@interface.

  • 委任に関する限り、プロトコルと委任は Objective-C の主要部分であり、Apple の API で広く使用されています。 このリンクは、それらがどのように機能するかを理解するのに役立つ場合があります。それは私を大いに助けました。

于 2013-08-24T17:56:56.957 に答える