0

UIViewControllercalledMasterViewControllerとの 2 つのサブクラスがあるとしDetailViewControllerます。

DetailViewControllerには、とNSNumber呼ばれるタイプのプロパティがあります。levelUILabellevelLabel

MasterViewControllerDetailViewControllerと呼ばれるセグエがありToDetailます。MasterViewControllerの prepareForSegue はそのようなものです

    - (void)prepareForSegue:(UIStoryboardSegue)segue sender:(id)sender
    {
       if ([segue.identifier isEqualToString:@"ToDetail"]) {
         DetailViewController *detailVC = (DetailViewController *)segue.destinationViewController;
         detailVC.level = [NSNumber numberWithInt:10]; // never mind the literal...pretend there was some algorithm for it
       }
     }

それでは、DetailViewController次のように levelLabel のセッターを実装します。

     - (void)setLevelLabel:(UILabel *)levelLabel
     {
       if (levelLabel) {
         _levelLabel = levelLabel;
         _levelLabel.text = level.stringValue;
       }
     }

これは良いコード設計ですか?また、私のコードの書き方について批評していただけますか? 私はほとんどすべてのコードをオンザフライで書いたので、これはほとんどの部分でコードを書く方法です。

これは、セグエに依存するほとんどすべてのラベル テキストの設定を実装する方法であるため、シャワーを浴びながらこの質問を考えました。

4

1 に答える 1

2

以下は、そのような関係についての私自身の考え方です。イタリック体はあなたの質問に適用されます。

制御されているもの (ラベル) コントローラー (宛先ビュー コントローラー) と、それが制御されているコンテキスト (ソース ビュー コントローラー) があります。これはモデル-ビュー-コントローラーとも表現できますが、コンテキストについて考えることは、より具体的でローカライズされた状況に適用できると思います。

一般的には、情報の流れをコンテキストから下に向かって一方向に保つようにする必要があります。オブジェクトは、それが存在するコンテキストを認識している必要はありません。つまり、情報を要求する必要はなく、操作に必要なすべての情報を伝えられる必要があります。したがって、ソース ビュー コントローラーはレベルを宛先ビュー コントローラーにプッシュする必要があり、宛先ビュー コントローラーはこの情報をラベルにプッシュする必要があります。これはあなたがすでに持っているものです。

上記に基づいて、情報が一方向に流れるだけでなく、関係が因果関係にあることを確認します。つまり、あるオブジェクトから別のオブジェクトに情報をプッシュすると、その後次のオブジェクトにプッシュされる必要があります。あなたのコードはこれを行っていないため、おそらくあなたはそれについて気分が悪い.

より適切な方法は、レベル セッター内でラベルのテキスト プロパティを設定することです。これにより、レベルを設定または変更すると、ラベルが後で更新されます。ラベルが読み込まれる場合と読み込まれない場合があるため、使用しているかどうかを確認する必要があり-isViewLoadedます。-viewDidLoad最初のロード時に text プロパティを設定する適切な場所です。

(私が「プッシュ」と言うとき、それはプロパティの設定または引数の受け渡しについての私の考え方です。これは、方向性を暗示しているためです。これは実際には依存性注入です。情報をプルする例としては、デリゲートとデータ ソースがあります。ただし、ここでもオブジェクトはそうではないことに注意してください。コンテキストを認識しない場合、デリゲートとデータ ソースはクラスではなくプロトコルとして明確に定義され、通常は同じヘッダー ファイル内にあり、それ自体が周囲のコンテキストからオブジェクトにプッシュされます。独自の用語であり、知識のないシステムからのものです。)

再コーディング スタイル:

それはまさに私がコードを書く方法ですが、Appleはアンダースコアプレフィックスの使用を予約していることに注意してください

于 2012-07-20T12:47:27.850 に答える