iPhone子视图设计(UIView vs UIViewController)

7
我正在设计一个简单的测验应用程序。该应用程序需要显示不同类型的测验问题。每种测验问题都有独特的行为和用户界面。
用户界面将类似于这样: alt text http://dl.getdropbox.com/u/907284/Picture%201.png 我希望能够在Interface Builder中设计每种类型的测验问题。
例如,多选测验问题将如下所示: alt text http://dl.getdropbox.com/u/907284/Picture%202.png 最初,我计划将QuizQuestion类作为UIViewController。然而,我在苹果文档中读到UIViewControllers只应用于显示整个页面。
因此,我将我的QuizController(管理整个屏幕,例如上一页/下一页按钮)作为UIViewController,并将我的QuizQuestion类作为UIView的子类。

然而,要加载此在IB中创建的UIView,我必须在我的构造函数中[1]执行以下操作:

//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
}

这种访问方式似乎不是标准的面向对象的。这种代码类型正常/可接受吗?还是我的设计中某处出现了问题?谢谢。
编辑(为了更清晰):我想要一个单独的类来控制multipleChoiceView...像一个ViewController,但显然只适用于整个窗口。也许我应该创建一个MultipleChoiceViewManager(而不是controller!),并将文件的所有者设置为它?
2个回答

5

你走在正确的道路上。在你的QuizController xib中,你可以通过将它们拖到xib的主窗口而不是QuizController的主视图上来创建单独的视图。然后,你可以根据你的问题类型设计每个需要的视图。当用户点击下一个或上一个时,使用-view controller的主视图上的-addSubview方法删除前一个视图并加载你需要的视图,同时跟踪当前显示的子视图。尝试像这样做:

[currentView removeFromSuperView];

switch(questionType)
{
    case kMultipleChoice:
        [[self view] addSubview:multipleChoiceView];
        currentView = multipleChoiceView;
        break;
    case kOpenEnded:
        [[self view] addSubview:openEndedView];
        currentView = openEndedView;
        break;
// etc.
}

在您的QuizController中,multipleChoice view和openEndedView是与IB中设计的视图连接的UIView输出。在将其添加到正确位置之前,您可能需要调整父视图中视图的位置,但可以通过对UIView调用-setBounds/-setFrame和/或-setCenter来完成此操作。


谢谢,但我想要一个单独的类来控制multipleChoiceView...像ViewController一样,但显然这只适用于整个窗口。也许我应该创建一个MultipleChoiceViewManager(而不是controller!)并将File's Owner设置为它? - tba
我觉得你用那种方式会让自己更难。无论如何都必须使用委托,因此你的决定是关于你希望你的代码放在哪里——在它自己的类中还是在它将被使用的视图控制器类中。显然取决于你,但我认为把它放在它自己的类中并没有什么好处。最好的问候。 - Matt Long

0

是的,iPhone上的IB真的希望File's Owner成为一个UIViewController子类,这使得你想要的有点棘手。你可以做的是加载nib到现有的UIViewController中,而不是使用nib实例化一个UIViewController:

@implementation QuizController

- (void) loadCustomViewFromNib:(NSString *)viewNibName {
  (void)[[NSBundle mainBundle] loadNibNamed:viewNibName owner:self options:nil];
}

@end

这将导致运行时加载nib,但不是创建一个新的视图控制器来连接操作和插座,而是使用您传递的owner。由于我们在调用后将self传递给视图中定义的内容,因此该nib将附加到您分配给其的任何IBOutlet。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接