堆叠UIViewControllers中的UITextView委托问题

时间:2013-01-13 13:56:34

标签: ios objective-c uiviewcontroller delegates uitextview

我想在UIViewController 菜单 之上堆叠UIViewController Board 以创建Facebook像侧面菜单。此菜单应包含UITextView。

到目前为止,我可以拖动Board View侧面方式,菜单显示在它下面。大。但是菜单中的UITextView存在问题。当我点击它时,应用程序崩溃并出现BAD_EXC ...异常。这似乎是UITextView Delegate的一个问题。

以下是我目前的设置方式。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    //Board
    board = [[BoardViewController alloc] init];
    [self.window setRootViewController:board];

    //Menu
    MenuViewController* menu = [[MenuViewController alloc]init];
    menu.textView.delegate = menu;
    [self.window addSubview:menu.view];

    //Window
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

注意:当我将textView委托设置为 board 并实现委托方法时,它可以工作,但实际上对我来说实现菜单textview方法似乎是错误的。菜单的代表应该在菜单类本身。

如何将菜单的textView委托正确设置为菜单类?

2 个答案:

答案 0 :(得分:2)

//Menu
MenuViewController* menu = [[MenuViewController alloc]init];
menu.textView.delegate = menu;
[self.window addSubview:menu.view];

然后,poof:菜单视图控制器不再被引用并被ARC取消分配。视图由窗口保留,因此看起来一切正常,直到文本视图尝试将其委​​托消息发送到自解除分配后很久的对象。这是EXC_BAD_ACCESS崩溃的原因。

简单,松散的解决方案是在菜单视图控制器的app委托中定义属性。

@property (nonatomic, strong) MenuViewController * menu;

然后将菜单存储在那里

//MenuViewController* menu = [[MenuViewController alloc]init];
//becomes
self.menu = [[MenuViewController alloc]init];

正确的解决方案和我推荐的解决方案是你查找UIViewController containment并实现自己的自定义视图控制器容器,该容器负责管理视图控制器的这种特殊排列。

简要概述:您将拥有一个具有两个属性的UIViewController子类,一个用于电路板视图控制器,另一个用于菜单视图控制器。它将具有滚动视图,并且将负责滑动动作以及需要从板传递到菜单的任何通信,反之亦然。该容器还负责加载板和菜单视图控制器,并将其视图插入到自己视图中的正确位置。如果需要将电路板视图控制器换成另一个电路板,那么容器也将对此负责。

答案 1 :(得分:0)

通常通过将委托连接从textField拖动到界面构建器中的视图控制器,或者在菜单视图控制器的viewDidLoad中以编程方式设置。你是对的,你的应用代表不应该与这个过程有任何关系。