2

UIView には、最上位のビュー コントローラーに IBAction とメソッドを含むナビゲーション ボタンがあります。

IBAction コードでは、boolean を反転させて、実行が UIView に戻ったときに、drawRect の前にいくつかの新しいセットアップ、つまりビューの再描画を行うようにしています。

これらすべてが ViewController にある場合は、新しいセットアップ コードを ViewDidAppear などに配置して、ボタンが押されるたびに実行されるようにすることができます。ただし、UIView レベルではそのようなメソッドはありません。initWithCoder がありますが、これは一度だけ実行されるようです (ストーリーボード/nib のロード時)。

だから私の質問は - どちらか、VC レベルで私の IBAction から initiWithCoder メソッドを明示的に呼び出す方法はありますか ([self initWithCoder:nil] を試しましたが、UIView レベルのブレークポイントはトリガーしません)、またはそこにありますか? ViewDidAppear? のように、実行が UIView レベルに戻ったときに実行されるメソッド

ありがとう

ゴールのイメージ: ここに画像の説明を入力

4

1 に答える 1

2

自分が何をしているのか本当にわかっていない限り (つまり、本当にわかっているという意味です)、自分で -initWithCoder: を呼び出さないでください。実装してシステムに呼び出させるのと同じように実装することを意図しています。このようなものを直接呼び出して、他に方法がない深い技術的な理由を説明できない場合は、それは間違ったアプローチです。ドキュメント (メソッドのドキュメントだけでなく) を読んで従い、使用しているメソッドを確実に理解してください。教えてくれます。-drawRect:

そうは言っても、ビューが「表示される」ときはいつでも「何かを行う」(BOOL をチェックし、YES/NO の場合は何らかの作業を実行する) ことができるビューのライフサイクルのポイントがあるかどうか疑問に思っていることです。答えはイエス-willMoveToSuperviewです。

しかし

それは「間違った」アプローチです、IMO。BOOL プロパティ (「次に描画を求められたときにひねりを描画する」) は UIView に存在する可能性があり、おそらく存在する必要がありますが、これはapp に固有であるため、その状態はコントローラーに設定する必要があります。ビューは (高度に) 再利用できるはずです。コントローラーは、アプリの特定のロジックを実装し、モデルの状態とユーザー (またはシステム) のアクションに従ってビューを駆動することになっています。

したがって、「ひねりを描く」操作を有効にする場合は、ビュー コントローラーでビュー インスタンスのdrawTwiddleフラグを設定してから、おそらくビューに描画用のフラグを設定する必要があります。その後、ビューには-drawRect : が呼び出され、制御しようとしてはならない時点で呼び出されます。制御しようとすると、それを認識して、self.drawTwiddle == YES他の描画と一緒にひねりを描画します。

その時点で、ビヘイビアーは 1 回起動することを意図しているため、ビューに独自のdrawTwiddleフラグを設定させたくなるかもしれません。NOこれをしないでください。注意: 他のユーザー アクションまたはシステム イベントが-drawRect:いつでも呼び出される可能性があるため、実際にはユーザーに回転が表示されない場合があります (表示されるよりも速く表示および非表示になる可能性があります)。「だから」、正しいことは、フラグの設定drawTwiddle設定解除を担当するコントローラーを(何らかの直接アクション、システムイベント、またはタイマーを介して)作成し、次に再表示のためにビューにフラグを立てることです。

追加する

IBOutlet または IBAction を UIView に配置することも珍しいことです。ほとんどの場合、部分が個別にアクセスおよび管理されることを意図していない複合コントロールを作成している場合を除き、コントローラーが管理/所有できるようにすることで、アーキテクチャはより明確になります (MVC デザイン パターンの精神により厳密に従います)。アウトレットとアクション。

于 2013-02-25T01:34:27.277 に答える