在目标viewController上设置委托

时间:2014-09-26 02:18:39

标签: ios objective-c uitextfielddelegate

这令我感到困惑。

上下文

The original tutorial I'm following.

enter image description here

通过自定义segue将segue添加到主视图中:

- (void) perform {

    MainViewController *source = (MainViewController *)self.sourceViewController;
    UIViewController *destination = (UIViewController *) self.destinationViewController;

    for(UIView *view in source.main.subviews){
        [view removeFromSuperview];
    }

    source.currentViewController = destination;
    destination.view.frame = CGRectMake(0, 0, source.main.frame.size.width, source.main.frame.size.height);
    [source.main addSubview:destination.view];
}

TextField 在子视图控制器中作为委托连接。在所有条件相同的情况下,我的应用程序崩溃而没有任何消息。


解决方法

在主视图控制器中,-(void)prepareForSegue:我在此期间添加了[segue.destinationViewController setDelegate:self];我在子视图控制器id<UITextFieldDelegate> delegate中添加了一个属性,并将文本字段委托修改为{ {1}}。

这样可行,但问题是我要在主视图控制器中设置委托方法,因为我要添加更多视图控制器,因此效率不高。


目标

如何在不崩溃的情况下将每个View Controller设置为自己的委托?

3 个答案:

答案 0 :(得分:3)

错误的直接原因是您的视图所属的视图控制器正在被释放。在视图控制器被取消分配时,您的视图在屏幕上这一事实凸显了从一个视图控制器获取视图并将其添加到另一个视图控制器的方法的根本缺陷。查看控制器包含是解决此类问题的正确方法。

将currentViewController属性更改为strong将修复您看到的内存管理问题,但它只是一个绑定。您的currentViewController仍将缺少旋转方法,外观和消失方法,布局方法等。视图控制器包含确保为视图在屏幕上的视图控制器调用这些方法。

Here is an altered version of your project说明了如何使用视图控制器包含。我认为这比手动删除和添加视图控制器本身的子视图更好。有关自定义视图控制器容器的详细信息,请参阅the Apple docs

答案 1 :(得分:1)

你应该为destinationViewController创建一个自定义类,它将实现UITextFieldDelegate

@interface DestinationViewController <UITextFieldDelegate>

@end

从storyboard中将类添加到具有TextField的UIViewController enter image description here

并为元素和TextField委托创建连接。

实施委托方法。

您将不再需要prepareForSegue:的实施。您将拥有两个具有不同元素的不同类。只有当您需要将某些内容从source传递到destination时,才会使用prepareForSegue:

希望你能理解

答案 2 :(得分:1)

首先,让我们看看崩溃报告。请执行以下操作:
 1.添加异常断点
 2.如图所示编辑

enter image description here