Iphone Objective-C中的Actionscript样式事件?

Iphone Objective-C中的Actionscript样式事件?,iphone,objective-c,events,actionscript,Iphone,Objective C,Events,Actionscript,我是做Objective-C的新手,来自Flex/Actionscript开发 我有一个iPhone应用程序,它带有一个名为MyAppDelegate的UIApplicationDelegate一致委托,它有一个UIWindow 我想我应该为我想制作的每个屏幕制作一个子类UIViewController,而不是直接在窗口中添加按钮、标签等等。当显示该屏幕时,我将相应控制器的视图作为子视图添加到窗口中。当显示另一个屏幕时,我应该从窗口弹出任何其他视图并添加新视图。希望到目前为止我一切都正确 我的意

我是做Objective-C的新手,来自Flex/Actionscript开发

我有一个iPhone应用程序,它带有一个名为MyAppDelegate的UIApplicationDelegate一致委托,它有一个UIWindow

我想我应该为我想制作的每个屏幕制作一个子类UIViewController,而不是直接在窗口中添加按钮、标签等等。当显示该屏幕时,我将相应控制器的视图作为子视图添加到窗口中。当显示另一个屏幕时,我应该从窗口弹出任何其他视图并添加新视图。希望到目前为止我一切都正确

我的意图是让每个视图控制器只知道自己的事情,所以让我们假设我想从视图B调用视图A,在ActionScript中,我会在一个触发事件中添加一个按钮,该事件将在视图A的拥有对象(可能是应用程序)中捕获,该事件可以采取适当的操作(删除视图A,实例化视图B并显示它)


如何在Objective-C中实现这一点?

如果您来自Actionscript,您可能会有兴趣查看。使用PureMVC,您将为应用程序交互创建中介、命令和模型的组合

使用PureMVC,您可以在
facade
中注册通知,并在中介中定义侦听器来响应这些通知。这与您在Actionscript中使用的事件模型非常接近。(在我的上一份工作中,我们向
UIResponder
添加了一些类别,以消除执行此操作的一些缺点)。如果您正在创建一个相当大的应用程序,那么我建议您查看一下;它确实帮助我们保持一切可控


如果不想引入第三方库,则应在
MyAppDelegate
中定义视图操作代码,并使用class方法访问全局共享实例

UIControl(如UIButton)可以注册任意数量的事件侦听器:

- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
目标将是您想要接收方法的视图控制器,而操作是您想要调用的方法。对于按钮,事件通常只是
UIControlEventTouchUpInside
。如果目标为nil,则事件将向上传递响应程序链,直到响应程序执行该操作。如果您通过
@选择器(按钮点击:)
,则目标应具有以下方法:

-(IBAction) buttonClicked:(id)sender;
发件人将是单击的按钮。iAction相当于一个void返回类型。如果您喜欢在Interface Builder中绑定操作,而不是以编程方式进行绑定,则可以在Interface Builder中绑定该操作

什么时候需要另一个屏幕 显示,我应该弹出任何其他 从窗口查看并添加新的 视图


这基本上是正确的,但通常使用元视图控制器(如
UINavigationController
)来管理视图控制器。即使您不使用元控制器可能提供的UI,也可以方便地为您管理视图切换。

您描述的基本概念/模式是响应者链。iOS SDK在内部为您实现了这一点,允许您为控件指定“nil”目标(无目标)和操作(按钮等)。按钮的动作将通过响应器链“冒泡”,使每个对象都有机会处理它。谢谢。这实际上是我最后使用的答案。但是不能“检查”它;-)尽管本页上的其他答案都是正确的,但这取决于应用程序和环境。。。我所做的:在page1的nib文件中,我单击FirstResponder,转到“Responder Identity”,并添加了一个新操作“goPage2:”。然后我在第1页用一个按钮把它连接起来。在page1控制器中,我能够捕获事件。但是,我将捕捉功能移到了“父”控制器上,它可以工作。我想现在已经足够了……正如您所注意到的,我已经看到使用UINavigationController(或tab控制器)将是首选。然而,这些控制器总是(或多或少)在屏幕上保持可见,即在顶部或底部有一个包含主导航按钮的栏。然而,我的应用程序是一个文档查看器,其中查看文档是核心(可能会消耗大量内存),经过长时间思考后,我仍然没有找到一个现成的控制器。doc视图将是首次启动,并应占据100%的屏幕,没有导航栏。在另一个视图中,我想完全卸载文档视图以节省内存。使用导航控制器,使用
navigationBarHidden=YES
隐藏导航栏。从
视图中设置它将显示:推送的每个控制器的
。元视图控制器添加和删除它们显示的视图控制器的视图。调用
viewdiddefine:
后,您可以自由释放任何视图和其他资源,只要您可以在
loadView
视图中再次创建它们: