0

我想在UIViewController菜单上堆叠一个 UIViewController,以创建一个类似 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 委托正确设置为菜单类?

4

2 回答 2

2
//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 容器并实现您自己的自定义视图控制器容器,该容器负责处理这种特殊的视图控制器排列。

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

于 2013-01-13T14:11:33.813 回答
0

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

于 2013-01-13T14:02:35.880 回答