【问题标题】:iPhone subview design (UIView vs UIViewController)iPhone子视图设计(UIView vs UIViewController)
【发布时间】:2010-11-18 20:31:57
【问题描述】:

我正在设计一个简单的测验应用程序。应用程序需要显示不同类型的 QuizQuestions。每种类型的 QuizQuestion 都有不同的行为和 UI。

用户界面将如下所示: alt text http://dl.getdropbox.com/u/907284/Picture%201.png

我希望能够在 Interface Builder 中设计每种类型的 QuizQuestion。

例如,MultipleChoiceQuizQuestion 如下所示: alt text http://dl.getdropbox.com/u/907284/Picture%202.png

最初,我计划将 QuizQuestion 类设为 UIViewController。但是,我在 Apple 文档中读到 UIViewControllers 只能用于显示整个页面。

因此,我将 QuizController(管理整个屏幕,例如 prev/next 按钮)设为 UIViewController,并将 QuizQuestion 类设为 UIView 的子类。

但是,要加载这个 UIView(在 IB 中创建),我必须[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(不是控制器!)并将 File's Owner 设置为那个?

【问题讨论】:

    标签: objective-c iphone cocoa-touch uiview uiviewcontroller


    【解决方案1】:

    你在正确的轨道上。在 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.
    }
    

    multipleChoice 视图和 openEndedView 是 QuizController 中的 UIView 出口,连接到您在 IB 中设计的视图。在添加视图之前,您可能需要在父视图中弄乱视图的位置以使其显示在正确的位置,但是您可以通过调用 UIView 上的 -setBounds/-setFrame 和/或 -setCenter 来做到这一点.

    【讨论】:

    • 谢谢,但我想有一个单独的类来控制 multipleChoiceView ......就像一个 ViewController 但显然这只适用于整个窗口。也许我应该制作一个 MultipleChoiceViewManager(不是控制器!)并将文件所有者设置为那个?
    • 我认为您这样做会让自己变得更加困难。委派是你必须使用的东西,所以你的决定是你想要你的代码在哪里——在它自己的类中还是在将使用它的视图控制器类中。这显然取决于你,但我不认为你通过将它放在自己的类中获得任何东西。最好的问候。
    【解决方案2】:

    是的,iPhone 上的 IB 确实希望 File's Owner 成为 UIViewController 子类,这使您想要的东西有点棘手。您可以做的是针对现有的 UIViewController 加载 nib,而不是使用 nib 实例化一个:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多