2

からの相互作用だけを抽象化する方法を理解するのに助けが必要UIViewControllerです。すべての意図と目的のために、パズルを制御するビューコントローラーがあるとしましょう。一連のピースビュー、パズルボードビュー(ピースを配置する場所)、およびその他のいくつかのビューがあります。今、私はそれらのパズルのピースとの典型的なパンスタイルの相互作用を持っています。

私がする必要があるのは、その相互作用を抽象化して、ボタンをクリックするかメソッドを呼び出すだけで、すべての状態を維持しながら、いわばシステム全体の「相互作用モード」を完全に変更できるようにすることです。それ以外の場合は、切り替え前の正確な場所です。たとえば、指でピースをドラッグする代わりに、切り替え後、ピースを「選択」してから、重力を使用してジャイロでスライドさせる必要があります。

私はiOSにまったく慣れておらず、実際には一般的にOOの経験がほとんどないので、コードを切断してこれを理解する前に、経験豊富な人からアドバイスをもらいたいと思っています。(はい、スナップショットを撮りますが、まだ緊張しています!)とにかく、私は多分私はこのようなことをすべきだと思っていました:

  • 私のビューへの強力なポインターを保持し、相互作用に関連しないすべての処理を行うルートビューコントローラーを用意します
  • そのルートビューコントローラーに、すべてのインタラクションコードを処理することがジョブであるインタラクションコントローラーへのポインターを設定します
  • インタラクションコントローラーは、実行時に委任を介してルートビューコントローラーから委任を介してビューを取得し、ジェスチャーレコグナイザーなどをviewDidLoadのビューにアタッチします
  • インタラクションコントローラーは、実行時にスイッチアウトされます。受け入れ可能なインタラクションコントローラーオブジェクトは、この目的のために定義したUIInteractionViewControllerのサブクラスからのものになります。

これでいいのかわからない

a)実際に機能する

b)それを行うための最良の方法である

c)実行時に実際に動作するのに十分な速度である

d)スケーラブルである(これらの異なる「モード」の多くが必要になる場合があります)。

実際、自分が書いたものを見れば見るほど、その意味を疑うようになります。助けてください。

ありがとう!

4

2 に答える 2

1

良い質問。

私の観点からすると、OOはアプリ開発にとって重要なポイントです。多くのアプリ開発者はOOの経験がまったくないため、ここSOで多くの誤解、苛立ち、奇妙な質問と回答が発生します。まず、Cocoasフレームワークの基本的なアーキテクチャとその使用方法についての理解が不足しています。これは、Cocoasフレームワークが多くの面で継承とオブジェクト構成の概念に従い、OOパターンを利用しているためです。この欠如は、フレームワークとの大規模な戦い、および/または(最初のOOのレッスンが学習されたとき)OOの概念に関する完全な過剰設計のいずれかを引き起こします。

あなたの質問に対して:フレームワーク内で何が起こっているのかを理解するために、基本的なオブジェクト指向の原則について十分に学んだようです。今、あなたは物事を単純に保つことに注意する必要があります。あなたのパズルゲームは典型的なアプリのように聞こえます:あなたは一人でまたは少数の人で作業します、コードベース全体は小さくなります、それはライブラリではありません、それはライフサイクルがかなり短くなります、一度行われるとあなたはバグを修正して小さくなります改善されますが、新しい環境を完成させるための適応などはありません。したがって、質問で説明されている問題にOOパターンを多用する必要はないと思います(説明されている解決策は機能すると思いますが)。

私はこのようなことをします:

  1. 次のように必要なすべてのものを実装することにより、puzzelのViewControllerにすべてのイベント処理を実行させます。

    touchesBegan、、、、touchesMoved_ touchesEnded_accelerometer:didAccelerate:

  2. このコントローラーにモードを与え、ボタンを押してオンに切り替えます。

    int controlMode; // in PuzzleController.h

  3. 次のように、イベント処理で制御モードをオンにします。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  switch (controlMode)
  {
    case ControlModeDrag:
      touchedPiece = [self findPiece:event];
    case ControlModeGravity:
      //do nothing;
    case ControlModeSomethingElse:
      // whatever
    default: //...
  }
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
  switch (controlMode)
  {
    case ControlModeDrag:
      [self moveTouchedPiece:event];
    case ControlModeGravity:
      //do nothing;
    case ControlModeSomethingElse:
      // whatever
    default: //...
  }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
  switch (controlMode)
  {
    case ControlModeDrag:
      touchedPiece = nil; 
    case ControlModeGravity:
      touchedPiece = [self findPiece:event]; 
    case ControlModeSomethingElse:
      // whatever
    default: //...
  }
}

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 
{
  switch (controlMode)
  {
    case ControlModeDrag:
      //do nothing 
    case ControlModeGravity:
      [self moveTouchedPiece:accelaration]; 
    case ControlModeSomethingElse:
      // whatever
    default: //...
  }
}
于 2012-05-02T09:41:24.763 に答える
0

これを読んでください..それが役立つことを願っています。
http://borkwarellc.wordpress.com/2010/07/22/qff-kitchen-mvc-part-1/

于 2012-05-02T09:39:00.473 に答える