Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iPhone子视图设计(UIView与UIViewController)_Objective C_Iphone_Cocoa Touch_Uiview_Uiviewcontroller - Fatal编程技术网

Objective c iPhone子视图设计(UIView与UIViewController)

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按钮)

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

用户界面如下所示:

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

例如,一个多重切磋技巧问题如下所示:

最初,我计划让QuizQuestion类成为UIViewController。然而,我在苹果的文档中读到UIViewController应该只用于显示整个页面

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

但是,要加载此UIView(在IB中创建),我必须在构造函数中执行以下操作:

//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!),并将文件的所有者设置为该值?我想你这样做会让自己更难。委托是您必须使用的,因此您的决定是关于您希望代码的位置——在它自己的类中,或者在它将被使用的视图控制器类中。这显然取决于你,但我不认为你把它放在自己的课堂上会有任何收获。顺致敬意,