0

我正在尝试将按钮触摸动作发送到控制器,而不是充当文件所有者的控制器。我有四个不同的屏幕区域,我希望由四个单独的控制器(buttonController、toolbarController、textController 和 graphicsController)管理,而第五个控制器(mainController)控制其他四个。mainController 也是与 File's Owner 相关联的控制器。要让 mainController 处理按钮按下很容易:

MainController.h 文件:

- (IBAction)buttonIsTouched:(id)sender;

MainController.m 文件:

- (IBAction)buttonIsTouched:(id)sender {
    ..handle button touch event etc.
}

然后在 Interface Builder 中,将按钮 Touch Down 事件与 File's Owner 相关联,然后选择buttonIsTouched并离开。一切正常。但是,当我对不是文件所有者控制器的控制器执行完全相同的操作时,应用程序会崩溃。这是我所做的:

创建四个控制器作为 mainController 的实例变量。将它们实例化为-[MainController viewDidLoad]. 提供与上述完全相同的按钮处理方法 在 Interface Builder 中,将一个 Object 模板从 Library(四次)拖到 mainController.xib 浏览器上。将这些对象的类型分别设置为ButtonControllerToolBarController和。将 Touch Down 按钮事件与对象关联并选择条目(在小弹出框中) 构建并运行应用程序 单击按钮 Crash - 抱歉,我没有写下错误代码,但它类似于 INVALID_ACCESSTextControllerGraphicsControllerButtonControllerbuttonIsTouched

当然,我可以让所有输入首先传递给 mainController,然后委托给每个单独的控制器,但这似乎是一个不雅的解决方案,特别是因为我希望较低的控制器在向 mainController 传递上游消息之前做一些工作。如果惹恼了我,必须通过 mainController 然后返回。

如果有人知道如何做到这一点并且有一些示例代码可以做类似于我想做的事情,我将不胜感激。

交流

4

1 回答 1

1

您的方法的一个问题是您为四个子控制器中的每一个实例化两个ButtonController对象ToolBarControllerTextControllerGraphicsController。您正在以编程方式创建控制器viewDidLoad,但它们已经从加载的 nib 中实例化。

您不应该在 中创建控制器viewDidLoad,而是使用您的保留IBOutlet属性MainController将它们连接到 IB 中。

然后控制器对象由 拥有,MainController并且在 nib 加载后不会被删除。这也将消除您的内存错误。

于 2010-02-05T11:30:37.070 回答