【问题标题】:Most accepted way to load a new iOS view without leaving current storyboard在不离开当前情节提要的情况下加载新 iOS 视图的最常用方法
【发布时间】:2013-06-20 08:23:40
【问题描述】:

我对 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 错误

【问题讨论】:

    标签: ios view storyboard


    【解决方案1】:

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

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

    【讨论】:

    • AddInfoController *infoSheet = [[AddInfoController alloc] init]; // 这是 ViewController 的子类
    • 对不起,我不擅长这个。我将我的代码添加到原始问题/
    【解决方案2】:

    以编程方式创建 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];
    

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

    【讨论】:

      【解决方案3】:

      看起来您正在调用 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
      }
      

      【讨论】:

      • 此外,崩溃日志有助于找出崩溃的来源
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多