1

我对 iOS 中的 Storyboards 感到困惑。我想使用它们并让我的代码尽可能现代,但有点困惑。这是我的问题:

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

这个菜单可以覆盖全屏,但我不想完全切换到新的 Storyboard,因为背景中有一些东西,我们需要尽快回到主视图。

我尝试过的一件事是为此菜单创建一个新的故事板并使用 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 错误

4

3 回答 3

1

好的 - 如果您一心想要使用 Storyboards 并且当您显示关闭按钮时应用程序不断崩溃,那么您肯定会犯错误。控制台错误消息会很有帮助。你在那里看到了什么。

如果 Storyboards 占用了我太多时间,我会以编程方式完成它并简单地呈现一个模态视图。如果您以前没有尝试过,请尝试以模态方式呈现视图控制器。您可以在此处了解更多信息。

于 2012-11-01T17:20:13.517 回答
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];

并创建一个操作按钮来关闭视图。

于 2012-11-01T19:01:17.833 回答
0

看起来您正在调用 removeFromParentViewController 但您实际上从未将其添加为子项。我不知道这是否是实际调用崩溃的原因,但基本上使用的格式是:

取自苹果

- (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
}
于 2013-06-20T00:23:40.070 回答