在UIViewController中初始化问题

时间:2015-06-25 08:30:56

标签: ios objective-c uiviewcontroller

我制作了一个MBTextViewController的自定义ViewController。当我像这样制作这个类的实例时

self.topTextView = [[MBTextViewController alloc] initWithNibName:@"MBTextViewController" bundle:nil];
self.topTextView.view.frame = CGRectMake(0, 0, self.topTextView.view.frame.size.width, self.topTextView.view.frame.size.height);
[self.mainContainerView addSubview:self.topTextView.view];

它的工作做得很好,所有的泛客都很好。

但是,当我尝试在运行时实例化它时,当我尝试移动对象时应用程序崩溃了。

MBTextViewController *textView = [[MBTextViewController alloc] initWithNibName:@"MBTextViewController" bundle:nil];
textView.view.center = self.mainContainerView.center;

[self.mainContainerView addSubview:textView.view];

顺便说一句,这是我的panGuesture识别器功能

CGPoint translation = [panRecognizer translationInView:[self.view superview]];
CGPoint viewPosition = self.view.center;
viewPosition.x += translation.x;
viewPosition.y += translation.y;
self.view.center = viewPosition;
[panRecognizer setTranslation:CGPointZero inView:self.view];

任何人都可以帮忙。

提前致谢。

3 个答案:

答案 0 :(得分:1)

错误访问会建议手势向已解除分配的对象发送消息。我认为当手势触发时,textView不再存在于内存中。在第一个例子中,textView是一个属性,即

html string

在第二个示例中,您只是创建一个很可能被解除分配的局部变量。再次将textView设为属性,看看是否有帮助。

当然,这都假定手势的委托是MBTextViewController。

答案 1 :(得分:1)

您还需要将视图控制器添加为子视图控制器。

MBTextViewController *textView = [[MBTextViewController alloc] initWithNibName:@"MBTextViewController" bundle:nil];
textView.view.center = self.mainContainerView.center;

[self addChildViewController:textView];
[self.mainContainerView addSubview:textView.view];

原因如下: 在方法中创建视图控制器时。视图控制器的分数仅限本地。当程序控制到达方法结束时,它会释放视图控制器。 iOS SDK鼓励为子视图添加子视图控制器。 在StoryBoard中使用ContainerView可以完成同样的事情。

答案 2 :(得分:0)

当您尝试获取手势回调时,请确保您的控制器已取消分配。当你像这样实例化控制器时:

MBTextViewController *textView = [[MBTextViewController alloc] initWithNibName:@"MBTextViewController" bundle:nil];

它仅保留在当前范围内,并在方法/函数结束时释放。这就是您遇到错误访问错误的原因。它需要至少有一个强大的参考来留在记忆中。制作textView一个@property (strong)可以解决问题