我想在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委托正确设置为菜单类?
答案 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中以编程方式设置。你是对的,你的应用代表不应该与这个过程有任何关系。