UI按钮崩溃应用程序除了(lldb)之外没有错误

时间:2013-04-29 21:37:03

标签: ios objective-c cocoa

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

此部分工作正常,视图添加正常。

然后在视图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");
  }

enter image description here

2 个答案:

答案 0 :(得分:7)

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

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

来自Apple's doc

  

实现容器的目标是能够添加另一个视图   控制器的视图(和关联的视图层次结构)作为您的子树   容器的视图层次结构。孩子仍然对自己负责   查看层次结构,保存容器决定放置它的位置   在屏幕上。添加子视图时,需要确保这一点   事件继续分发给两个视图控制器。你做   这通过明确地将新视图控制器关联为子视图   容器。

在实践中,它比听起来更简单。在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];
    }

答案 1 :(得分:-1)

试试这个:

    CreateRoutinePopupViewController *popUp = [[storyboard instantiateViewControllerWithIdentifier:@"createRoutinePopupView"];
   [self presentModalViewController:popUp Animated:YES];