目前我正在开发一个 iOS 项目。其中我有两个视觉上相似的对象派生自同一类。我想要的是当我对一个对象进行一些更改时需要在对象 2 中进行相同的更改。
详细:
我有一个类
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 个委托方法,需要实现相同的功能。我无法通过添加额外参数来更改委托方法。
这个问题有什么解决办法吗? 请帮助我,提前谢谢。
为什么我需要这个/实际实现:
我创建了一个可以缩放/旋转等的自定义视图。我创建了两个同一类的对象并将其添加到我的父视图中。现在,当我更改视图 1 上的任何内容时,它应该更改视图 2 中的类似内容。此外,我还需要添加更多视图。
基本上,因为您希望两个不同的对象引用完全相同的状态,所以您应该将这两个对象指向第三个对象 - 无论是具有静态状态的基类还是具有静态状态的第三种类型,或者是单例。这样做的好处是,Object1 不必了解 Object2,这意味着如果您添加了 Object3,则无需更改代码。
因此,每当您的对象写入共享状态时,就可以读取新值。如果您希望对象在更改时立即更改,那么您需要实现事件(我假设 iOS 具有),以便让 Object1 和 Object2 订阅共享状态的更改。
我不使用 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);
}
}
我知道这段代码很糟糕,但它只是为了说明我的意思:-)
因此,通过使用该参数,如果您的主对象 1 发生更改并且您手动调用对象 2 的委托方法,并通过设置条件,您可以摆脱问题。