在Cocoa Touch中管理子视图
我正在开发iPhone应用程序。我需要创建一个嵌入了不同问题视图的测验应用程序(请参阅我的similar question)。在Cocoa Touch中管理子视图
不同类型的问题会有不同的行为,所以我打算为每种类型的问题创建一个控制器类。 MultipleChoiceQuestionController会设置一个问题和3-4个按钮供用户选择一个答案。同样,IdentifyPictureQuestionController会加载一个图像并向用户显示一个文本框。
但是,docs表示UIViewController应该只用于占用整个应用程序窗口的视图。我还可以创建一个班级来管理我的子视图中的事件?
感谢,
您可以处理的观点本身,或者您的视图控制器的事件可以有一个委托类改变针对不同类型的问题。该代表将处理不同的输入,并以不同的方式对用户触摸作出反应。
这里有一些代码的想法。
// In QuestionViewControllerDelegateProtocol.h
@protocol QuestionViewControllerDelegateProtocol
// Define the methods you want here
- (void)touchesBegan;
- (void)touchesEnded;
- (void)questionLoaded;
@end
// In QuestionViewController.h
@interface QuestionViewController {
id<QuestionViewControllerDelegateProtocol> delegate;
}
@end
// In QuestionViewController.m
@implementation QuestionViewController
- (void)viewDidLoad:(BOOL)animated {
[delegate questionLoaded];
}
- (void)touchesBegan {
// Some processing logic.
[delegate touchesBegan];
}
@end
子类的UIViewController将提供此功能。例如,MultipleChoiceQuestionController将是UIViewController的一个子类。 MultipleChoiceQuestionController将包含问题文本(UILabel或UITextView)和几个按钮(UIButton)。您可以在MultipleChoiceQuestionController中创建一个自定义构造函数,它将填充相关问题字符串和其他相关信息的视图。
当你想MultipleChoiceQuestionController的视图添加到您的主视图中的子视图,只需做到以下几点:
[myMainView addSubview:instanceOfMultipleChoiceQuestionController.view];
苹果说不会:“注意:你不应该使用视图控制器来管理意见只能填充其窗口,也就是说,只能由应用程序内容矩形定义的区域的一部分的一部分。如果你想有一个由几个较小的视图组成的界面,将它们全部嵌入到一个单独的根视图中,并使用视图控制器来管理该视图。 (http://developer.apple.com/iphone/library/documentation/ UIKit/Reference/UIViewController_Class/Reference/Reference.html#// apple_ref/doc/uid/TP40006926-CH3-DontLinkElementID_1) – tba 2009-08-14 06:13:14
我有同样的问题,并根据苹果的文档,这里是你应该做的:
注意:如果你想要一个 屏幕分为多个区域和管理 每一个分别使用通用控制器对象(自NSObject降序的自定义对象 )而不是 视图控制器对象来管理屏幕的每个 子部分。然后使用一个 单个视图控制器对象到 管理通用控制器对象。 视图控制器协调整个屏幕交互 ,但 根据需要将消息转发到其管理的通用控制器对象。
这是一个非常不错的小的解决方案,为您提供所有的视图控制器的优势没有打破苹果的规则。
从页面:
这是一个通用控制器类 可以用来处理一个分区。 它仿照UIViewController, 建模,但符合Apple的 建议。
您的视图控制器创建 实例并负责管理子视图控制器的 。 或者你可以进一步 细分你的视图层次和 在 其他子视图控制器内创建子视图控制器。在 的情况下,实例化 对象的控制器负责管理子视图控制器 。负责的控制器被称为“父控制器 ”。当子视图例如 需要显示模式对话框时,子视图可以使用视图控制器 。
让委托类扩展UIViewController,bu苹果公司的文件告诉我不要。那我该如何制作像viewDidLoad这样的方法:fire? – tba 2009-08-14 18:32:28
我不是在说这里的App Delegate。我正在谈论一个自定义的委托类,这是你的'UIViewController'不做的一部分工作。这样可以根据所选视图(问题类型)交换该代理人 – pgb 2009-08-14 18:58:54
谢谢。所以我想使用loadNibNamed:@“MySubview”所有者:myCustomDelgate。子视图加载时会通知myCustomDelegate吗? – tba 2009-08-14 20:33:50