1

現在、私は iOS プロジェクトに取り組んでいます。同じクラスから派生した 2 つの視覚的に類似したオブジェクトがあります。私が欲しいのは、オブジェクト2で同じものを変更する必要がある1つのオブジェクトでいくつかの変更を行うときです.

詳細に:

私はクラスを持っており、MyClassからobj1派生obj2していMyClassます。いくつかのアクションを実行するobj1と、対応する のデリゲート メソッドが呼び出されますobj1。今私が欲しいのは、obj1デリゲート メソッドを呼び出すときに、のデリゲート メソッドも呼び出す必要があることですobj2。同じように: 変更するobj2と、obj1. また、今後さらに要素を追加する必要があります。

私がしたこと:

Singleton クラスを追加し、その上に配列を配置して、それにオブジェクトを追加しました。

デリゲート メソッドでは、次のようになります。

- (void)delegateMethod:(id)param
{
   NSMutableArray *arr = [[MySingleTon sharedObject] getArray];
   for(int loop = 0;loop<[arr count];loop++)
   {
      if(![arr objectAtIndex] == self)
      {
          [[arr objectAtIndex:loop] delegateMethod:param];
      }
   }
}

何が起こったのですか:

しかし問題は、それが無限ループを引き起こすことです。Obj2 は同じことを行い、他のすべてのオブジェクトも同じことを行います。約 25 のデリゲート メソッドがあり、同じ機能を実装する必要があります。追加のパラメーターを追加してデリゲート メソッドを変更することはできません。

これに対する解決策はありますか?助けてください、事前に感謝します。

これが必要な理由/実際の実装:

ズーム/回転などが可能なカスタム ビューを作成しました。同じクラスの 2 つのオブジェクトを作成し、それを親ビューに追加しました。ビュー1で何かを変更すると、ビュー2でも同様に変更されるはずです。また、ビューを追加する必要があります。

4

2 に答える 2

1

基本的に、2 つの異なるオブジェクトがまったく同じ状態を参照するようにしたいので、これら 2 つのオブジェクトを 3 番目のオブジェクト (静的状態の基本クラス、静的状態の 3 番目の型、またはシングルトン) に向ける必要があります。これには、Object1 が Object2 について知る必要がないという利点があります。つまり、Object3 を追加しても、コードを変更する必要はありません。

したがって、オブジェクトが共有状態に書き込むたびに、新しい値を読み取ることができます。その変更でオブジェクトをすぐに変更したい場合は、Object1 と Object2 が共有状態の変更をサブスクライブするために、イベント (iOS が持っていると思います) を実装する必要があります。

私はiOSではありませんが、疑似コードで...

abstract class BaseClass {
 protected static sharedArray = new sharedArray();

  void someMethod(int i, int aNewValue) {
   BaseClass.sharedArray[i] = aNewValue;
  }

  int getSharedValue(int i) {
    return BaseClass.sharedArray[i];
  }
}

class ObjectOne extends BaseClass {

}

class ObjectTwo extends BaseClass {

}

これはスレッドセーフではなく、少しひどいですが、正しい方向に向けられるかもしれないことに注意してください。参照している状態が、各オブジェクトが参照したシングルトンによって保持されていた場合、はるかに整頓されます (ただし、スレッドセーフではありません)。

//this isn't written as a singleton
class MySingleton {
    private SharedArray sharedArray = new sharedArray();

    void someMethod(int i, int aNewValue) {
       BaseClass.sharedArray[i] = aNewValue;
    }

    int getSharedValue(int i) {
       return BaseClass.sharedArray[i];
    }
}

class ObjectOne extends MyCustomViewObjectThing {
     private MySingleton mySingleton

     void doMyChangeActivity(int i) {
       mySingleton.someMethod(i, i);
     }
}

class ObjectTwo extends MyCustomViewObjectThing {
     private MySingleton mySingleton

     void doMyChangeActivity(int i) {
       mySingleton.someMethod(i, i*2);
     }      
}

私はこのコードがひどいことを知っていますが、私が何を意味するかを説明することだけを意図しています :-)

于 2013-03-20T10:34:31.520 に答える
0

あなたは一つのことをすることができます。Object1で変更を行う場合は、Object2のデリゲートメソッドを手動で呼び出します。したがって、Object2のデリゲートメソッドを手動で呼び出すと、そのデリゲートメソッドにすでにパラメータが含まれているため、パラメータリストに、このメソッドが呼び出されるオブジェクトを示すパラメータをもう1つ追加します。したがって、そのパラメータを使用することで、メインのobject1が変更され、Object2のデリゲートメソッドを手動で呼び出している場合、条件を設定することで問題を解決できます。

これがお役に立てば幸いです。

それでも助けが必要な場合は、私はここにいます。

ではごきげんよう !!!

于 2013-03-20T10:14:33.133 に答える