1

我正在处理在单击 UIButton 后添加视图 B (createRoutinePopupViewController) 的视图 A (createExerciseViewController)。

这部分工作正常,视图添加得很好。

然后在视图 B (createRoutinePopupViewController) 我有另一个 UIButton。当我单击此 UIButton 时,应用程序崩溃,我得到的只是错误,(lldb)并且未执行 NSLog。

但有时,只有有时,在几次崩溃后,一切都会很好地执行......

我对 iOS 开发世界很陌生,我不知道我做错了什么。

所有 UIButton 方法都是strong

有谁知道为什么会发生这种情况?

我认为问题可能在于我如何插入子视图和处理整个子视图?

A----createExerciseViewController.m

#import "createExerciseViewController.h"
#import "createExercisePopupViewController.h"
#import "createRoutinePopupViewController.h"

// ....more code

- (IBAction)createRoutine:(id)sender {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
    [self.view addSubview:[[storyboard instantiateViewControllerWithIdentifier:@"createRoutinePopupView"] view]];
}

这是UIViewController B ---- createRoutinePopupViewController.m

#import "createRoutinePopupViewController.h"
#import "createExerciseViewController.h"
#import "User.h"
#import "Routine.h"

- (IBAction)createRoutine:(UIButton *)sender {
    NSLog(@"Please dont crash");
  }

在此处输入图像描述

4

2 回答 2

7

你不应该创建视图控制器只是为了将它们的视图添加到另一个视图控制器的视图中。您需要告诉系统您正在将视图从一个控制器移动到另一个控制器,以便它可以进行内部管理。如果你不这样做,一个视图控制器最终会拥有一个由另一个视图控制器呈现的视图,因此事件和触摸等会变得混乱。这可能是导致崩溃的原因。

iOS 现在提供了一种“容器视图控制器”机制来管理这种情况,您可以告诉系统您正在将视图从一个控制器移动到另一个控制器。

来自Apple 的文档

实现容器的目标是能够将另一个视图控制器的视图(和关联的视图层次结构)添加为容器视图层次结构中的子树。孩子仍然负责自己的视图层次结构,除了容器决定将其放置在屏幕上的位置。添加子视图时,需要确保事件继续分发到两个视图控制器。为此,您可以将新的视图控制器显式关联为容器的子级。

在实践中,它比听起来简单。在 createExerciseViewController.m 中尝试这样的操作:

    - (IBAction)createRoutine:(id)sender {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];

        CreateRoutinePopupViewController* popupController = [storyboard instantiateViewControllerWithIdentifier:@"createRoutinePopupView"];

        //Tell the operating system the CreateRoutine view controller
        //is becoming a child:
        [self addChildViewController:popupController];

        //add the target frame to self's view:
        [self.view addSubview:popupController.view];

        //Tell the operating system the view controller has moved:
        [popupController didMoveToParentViewController:self];
    }
于 2013-04-29T22:13:21.810 回答
-1

尝试这个:

    CreateRoutinePopupViewController *popUp = [[storyboard instantiateViewControllerWithIdentifier:@"createRoutinePopupView"];
   [self presentModalViewController:popUp Animated:YES];
于 2013-04-29T21:54:18.953 回答