两个视图控制器可以相互代表吗?

时间:2010-01-30 18:22:12

标签: iphone objective-c xcode delegates

我正在学习Objective-c和cocoa触摸,同时构建应用程序,所以我有一个相当简单的问题(我认为),抱歉我没有足够的布朗尼点在网站上显示我网站的视觉图。

但是让我解释一下,我有以下

  • Main ViewController
  • ViewController A
  • ViewController B
  • ViewController C
  • ViewController 1
  • ViewController 2

ViewController A,B和C都具有Main ViewController正在使用的协议委托 ViewController 1和2具有ViewController C正在使用的协议委托。

但是我还需要ViewController C作为Main ViewController的委托。

因此我最近在Main ViewController中创建了一个协议委托,但是当我尝试将ViewController C指定为委托时,我遇到了错误,更特别是在尝试将Main ViewController的头文件导入View Controller C时由于以下原因导致编译失败的消息

  • 主ViewControllers头文件可以 不再找到协议 ViewController C
  • 预期的说明符限定符列表 在“ViewController C”
  • 之前

我想要完成的是什么?两个视图控制器可以相互委托吗?如果没有什么是完成我正在做的事情的想法?

在ViewController中,CI尝试了另一种方法,通过创建父视图控制器的指针来调用Main ViewController,创建ViewController B的实例(这就是我希望委托工作的原因),然后将ViewControler B的视图添加到我创建的新指针,这编译但不起作用(我会尝试找出原因,这不是我在这里要求的)。

非常感谢,我现在非常感谢这个网站

3 个答案:

答案 0 :(得分:1)

这闻起来很糟糕的应用程序设计。但要解决编译错误,您只需执行以下操作:

@protocol SomeDelegate;

@interface FooThatUsesSomeDelegate : NSObject {
    id<SomeDelegate> delegate_;
}
@end

通过转发声明 SomeDelegate,您不必将头文件包含在完全声明的位置。这对于两个类彼此依赖的情况非常有用。

您必须在实现源文件中包含头文件。但这通常不是问题。

答案 1 :(得分:1)

注意它们可以(如St3fan所述)描述,但这正是为什么应该始终在不保留引用的情况下分配代理的原因,否则每个代理都将保持另一个不被释放。

答案 2 :(得分:0)

使用ARC,您现在可以为您的代表使用弱引用:

@property(weak)id<MyDelegateProtocol> *delegate;

当取消分配其他视图控制器时,引用变为nil,并且您不需要手动跟踪其他对象生命周期。