【问题标题】:UITextView Delegate Issue in Stacked UIViewControllers堆叠的 UIViewControllers 中的 UITextView 委托问题
【发布时间】:2013-01-13 13:56:33
【问题描述】:

我想在 UIViewController Menu 上堆叠 UIViewController Board 以创建 Facebook - 像侧面菜单。这个菜单应该包含一个 UITextView。

到目前为止,我可以将 Board View 侧向拖动,菜单会出现在其下方。伟大的。但是菜单内的 UITextView 存在问题。当我单击它时,应用程序会因 BAD_EXC... 异常而崩溃。这似乎是 UITextView 委托的问题。

这是我目前的设置方式。

- (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 委托给菜单类?

【问题讨论】:

    标签: ios objective-c uiviewcontroller delegates uitextview


    【解决方案1】:
    //Menu
    MenuViewController* menu = [[MenuViewController alloc]init];
    menu.textView.delegate = menu;
    [self.window addSubview:menu.view];
    

    然后,噗:菜单视图控制器不再被引用,并且被 ARC 释放。该视图由窗口保留,因此看起来一切正常,直到文本视图尝试将其委​​托消息发送给早已被释放的对象。这就是您的EXC_BAD_ACCESS 崩溃的原因。

    简单、宽松的解决方案是在您的应用委托中为菜单视图控制器定义一个属性。

    @property (nonatomic, strong) MenuViewController * menu;
    

    然后将菜单存储在那里

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

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

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

    【讨论】:

    • 哇。非常感谢您的解释!那是大开眼界。我还将研究 UIViewController 容器。 :)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多