最常用的方法是在不离开当前故事板的情况下加载新的iOS视图

时间:2012-11-01 17:15:44

标签: ios view storyboard

我对iOS中的故事板感到困惑。我想使用它们并让我的代码尽可能地现代化,但有些困惑。这是我的问题:

在我的应用程序的主视图中,您单击一个按钮,一些耗时的事情发生在幕后(音乐播放,一些文件连接)。当发生这种情况时,我想要一个带有一些文本字段的菜单向上滑动并让用户输入一些信息,然后他会点击一个按钮来关闭此菜单。

此菜单可以覆盖整个屏幕,但我不想完全转换到新的故事板,因为后台正在进行操作,我们需要尽快回到主视图。

我尝试过的一件事是为这个菜单创建一个新的故事板并使用instantiateViewControllerWithIdentifier加载它,这可以工作,但是我不能在没有应用程序崩溃的情况下解除它。但也许还有更好的方法呢?什么是适当的编程风格?

有人询问我的代码,我认为这是我唯一可以提出的地方吗?这里是。在主视图中:

AddInfoController *infoSheet = [[AddInfoController alloc] init]; //subclass of viewcontroller
infoSheet = [self.storyboard instantiateViewControllerWithIdentifier:@"AddInfoView"];
[self.view addSubview:infoSheet.view];

然后在我的AddInfoController类中我有:

- (IBAction)clickedDoneButton:(id)sender {
   [self removeFromParentViewController];
}

在AddInfoView故事板中,我有一个挂钩到该IBAction的按钮。当它崩溃时,NSLog中没有任何内容,它向我显示了线程1中的一些十六进制内容和一个EXC_BAD_ACCESS错误

3 个答案:

答案 0 :(得分:1)

好的 - 如果您一直在使用故事板,并且当您出现解雇按钮时应用程序会一直崩溃,那么您肯定会犯一个错误。控制台错误消息将有所帮助。你在那里看到了什么。

如果故事板占用了我太多的时间,我会以编程方式进行,并简单地呈现模态视图。如果您之前没有尝试过,请尝试以模态方式呈现视图控制器。您可以详细了解here

答案 1 :(得分:0)

以编程方式创建UIView和UITextViews并将它们添加到主视图中。尝试这样的事情:

UIView *someView = [[UIView alloc]initWithFrame:CGRectMake(20, 20, 280, 420)];
    UITextField * someTextField = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 240, 44)]; // create uitextfield or something else as much as you want.
    [someView addSubview:someTextField];
    [someTextField release];
    [self.view addSubview:someView];
    [someView release];

创建一个动作按钮以关闭视图。

答案 2 :(得分:0)

看起来你正在调用removeFromParentViewController但你实际上从未将它作为一个孩子添加。我不知道这是否实际上是在调用崩溃,但基本上使用的格式是:

取自Apple

- (void) displayContentController: (UIViewController*) content
{
    [self addChildViewController:content];                 // 1
    content.view.frame = [self frameForContentController]; // 2
    [self.view addSubview:self.currentClientView];
    [content didMoveToParentViewController:self];          // 3
}

然后,在完成后,您可以反向调用等效方法:

- (void) hideContentController: (UIViewController*) content
{
   [content willMoveToParentViewController:nil];  // 1
   [content.view removeFromSuperview];            // 2
   [content removeFromParentViewController];      // 3
}