Objective c iPhone子视图设计(UIView与UIViewController)
我正在设计一个简单的测验应用程序。应用程序需要显示不同类型的QuizQuestions。每种类型的提问都有不同的行为和用户界面 用户界面如下所示: 我希望能够在Interface Builder中设计每种类型的提问 例如,一个多重切磋技巧问题如下所示: 最初,我计划让QuizQuestion类成为UIViewController。然而,我在苹果的文档中读到UIViewController应该只用于显示整个页面 因此,我将QuizController(管理整个屏幕,例如prev/next按钮)设置为UIViewController,将QuizQuestion类设置为UIView的子类 但是,要加载此UIView(在IB中创建),我必须在构造函数中执行以下操作:Objective c iPhone子视图设计(UIView与UIViewController),objective-c,iphone,cocoa-touch,uiview,uiviewcontroller,Objective C,Iphone,Cocoa Touch,Uiview,Uiviewcontroller,我正在设计一个简单的测验应用程序。应用程序需要显示不同类型的QuizQuestions。每种类型的提问都有不同的行为和用户界面 用户界面如下所示: 我希望能够在Interface Builder中设计每种类型的提问 例如,一个多重切磋技巧问题如下所示: 最初,我计划让QuizQuestion类成为UIViewController。然而,我在苹果的文档中读到UIViewController应该只用于显示整个页面 因此,我将QuizController(管理整个屏幕,例如prev/next按钮)
//MultipleQuizQuestion.m
+(id)createInstance {
UIViewController *useless = [[UIViewController alloc] initWithNibName:@"MultipleQuizQuestion" bundle:nil];
UIView *view = [[useless.view retain] autorelease];
[useless release];
return view; // probably has a memory leak or something
}
这种类型的访问似乎不是标准的或面向对象的。此类代码是否正常/可接受?还是我在设计的某个地方做了一个糟糕的选择
谢谢,
编辑(为清晰起见):我希望有一个单独的类来控制MultipleChiceView…就像ViewController一样,但显然这只适用于整个窗口。也许我应该制作一个multiplechiceviewmanager(而不是controller!),并将文件的所有者设置为该值?是的,iPhone上的IB确实希望文件的所有者是UIViewController子类,这让您想要做的事情有点棘手。您可以针对现有UIViewController加载nib,而不是使用nib实例化一个:
@implementation QuizController
- (void) loadCustomViewFromNib:(NSString *)viewNibName {
(void)[[NSBundle mainBundle] loadNibNamed:viewNibName owner:self options:nil];
}
@end
这将导致运行时加载nib,但它不会创建新的视图控制器来连接操作和出口,而是使用您作为所有者传入的内容。因为我们在视图中传递了self,在调用之后,nib将连接到您分配给它的任何IBOutlet。您走对了方向。在QuizController xib中,可以通过将视图拖动到xib的主窗口而不是QuizController的主视图来创建单独的视图。然后,您可以根据问题类型设计所需的每个视图。当用户点击“下一个”或“上一个”时,删除上一个视图,并在视图控制器的主视图上使用-addSubview根据问题类型加载所需的视图,并跟踪当前显示的子视图。试着这样做:
[currentView removeFromSuperView];
switch(questionType)
{
case kMultipleChoice:
[[self view] addSubview:multipleChoiceView];
currentView = multipleChoiceView;
break;
case kOpenEnded:
[[self view] addSubview:openEndedView];
currentView = openEndedView;
break;
// etc.
}
其中MultipleChice view和OpenEndeview是QuizController中与IB中设计的视图相连的UIView插座。在添加视图以使其显示在正确位置之前,您可能需要在父视图中弄乱视图的位置,但您可以通过调用UIView上的-setBounds/-setFrame和/或-setCenter来实现这一点。谢谢,但我希望有一个单独的类来控制MultipleChiceView…就像ViewController一样,但显然这只适用于整个窗口。也许我应该制作一个multiplechiceviewmanager(而不是controller!),并将文件的所有者设置为该值?我想你这样做会让自己更难。委托是您必须使用的,因此您的决定是关于您希望代码的位置——在它自己的类中,或者在它将被使用的视图控制器类中。这显然取决于你,但我不认为你把它放在自己的课堂上会有任何收获。顺致敬意,