确定视图包含视图行为的最佳方法

时间:2012-03-26 18:33:40

标签: objective-c hierarchy

我的情况:

ClassA可能有也可能没有ClassB类型的父级。因此说[instanceOfA.superview somethingClassBSpecific];是危险的一半。另外,Xocde会因为合理的原因而变得很脆弱。

这里的建议是在超级视图上发送通知,还是做一些逻辑,例如,

if([objectOfA.superview respondsToSelector:somethingClassBSpecific] != nil){
    //...
}

或者在情况允许的情况下创建类型为ClassB的委托?

2 个答案:

答案 0 :(得分:3)

通常情况如此,取决于。使用视图层次结构,通知和委派是对象可以相互通信的三种不同方式。决定哪些(如果有的话)最合适需要考虑相关对象如何相互关联。

通知在对象之间提供非常松散(几乎为零)的耦合。它们还提供一对多通信 - 您发布通知,并且正在侦听该通知的每个对象都将获得该消息。但通知并不总是合适的;沟通主要只在一个方向,滥用通知机制可能导致性能问题。

委派为您提供了一种自定义对象行为的方法。最明显的例子是应用程序委托。大多数iOS应用程序都基于同一个类:UIApplication。即使每个应用程序都有自己的功能,UIApplication也适用于每个应用程序。应用程序对象使用委托来提供自定义,为应用程序提供其独特的行为。

视图层次结构是(某些)对象彼此连接的另一种方式。如果您正在实现的行为是a)视图的一部分,b)依赖于该视图与其他视图的关系,那么使用superviewsubviews属性可能是有意义的。

那么,您尝试实现哪种功能?

答案 1 :(得分:2)

这取决于您的逻辑模型。如果您有一个实现具有可选方法的协议的类的实例,那么当您尝试调用其中一个可选方法时,使用respondsToSelector:是合适的。如果您希望调用的方法是必需的,请在您传递的类中创建一个无操作的“警卫”。这两种技术都是有效的,只是您是否希望您的用户意识到需要实施特定方法。