2012-05-01 49 views
2

我对视图控件层次结构使用iOS 5故事板。问题在于我有几个共享控制器类来处理我需要注入视图控制器的业务逻辑。这些控制器已初始化并保存在应用程序代理中。iOS故事板和注入属性

例如,我有一个控制器封装了我在一些视图控制器中使用的Dropbox交互。我可以通过参考prepareForSegue:sender:,但这使得整个视图控制器层次结构取决于控制器。此外,我可以使用单身模式,但我并不是很喜欢它。

如果我想让控制器松散耦合,我有什么选择?我听说过异议,我会仔细研究,但任何输入都会非常受欢迎

回答

0

我知道这有点迟,但希望它可以帮助别人。

我解决了这个问题,使用协议和检查要注入的对象响应某些选择器。

prepareForSegue方法我做两件事情之一:

如果目标控制器符合指定协议
id object = segue.destinationController; 
if([object conformsToProtocol:@protocol(HasApplicationManager) ]){ 
    [(id<HasApplicationManager>)object setApplicationManager:_applicationManager]; 
} 
if([object respondsToSelector:@selector(setViewDelegate:)]){ 
    [object performSelector:@selector(setViewDelegate:)withObject:self]; 
} 

第一比特检查,这是因为你建立与该组合物的图案的应用程序仍然松散耦合。

其次我检查选择器,这是比协议更不正式,可能更耦合,并提出更多的问题。但这是一种避开数百个'IHave ...'协议的方式。

+0

问题在于它将责任留给了调用视图控制器。考虑一个视图控制器被多个视图控制器使用的情况;这必须在每个视图控制器中完成。 – mkko

+0

这是一件好事。所以每个父视图控制器都可以不同地配置孩子。例如,如果视图控制器呈现给定的一组对象,则父视图控制器可以对其进行不同的配置。这允许很多可扩展性。 – MrJD

+0

可配置性很好,这就是DI框架的目标之一。问题在于变化。这与复制代码基本相同。另一件事是,在DI中定义你需要的资源是非常方便的,它们将被提供。使用这种手动注入会给用户错误留下太多的空间。我认为这可以扩展到一些实用程序,以后会注入缺失的属性。但是,我还不确定如何实现这一点。 – mkko