iOS touchup inside 事件迷之崩溃

2015-12-11 17:19:59 +08:00
 wohenyingyu01
代码结构大概是这样,我在 storyboard 拖了一个 uiviewcontroller ,继承了我自定义的某个 uiviewcontroller 子类,然后往里面随便拖了一个按钮。

在另外一个主 uiviewcontroller 上(不在 storyboard 里,纯代码写的 uiviewcontroller )通过[self.view insertSubview: xxxx atIndex:xxx]的方法把之前那个 uiviewcontroller 的 view 切进去。(通过 storyboard 的 instantiateViewControllerWithIdentifier 方法获取到之前的 uiviewcontroller ,感觉这个方法是从 storyboard 的模版里 alloc+init 了一个)

现在想给那个按钮加 touchupinside 事件,拖了一个空的 action 到其对应的类的代码里。跑起来看着很 6 ,但是一点那个按钮就崩溃( touchup 事件为空)主线程 exec_bad_access ,怎么破……

额,不知道讲清楚没
1952 次点击
所在节点    问与答
15 条回复
MerenguesGeek
2015-12-11 20:10:33 +08:00
建议贴上代码看看, 可以试着设置 NSZombieEnabled 看看 log 信息。
pupboss
2015-12-11 20:19:14 +08:00
粗略理解你是在 B 控制器里面强行塞进去了 A 控制器的 view ,先不说 [self.view insertSubview: xxxx atIndex:xxx] 这个有没有在最顶层,在 B 里面 点击 button , B 里面没有对应的方法,当然 bad access 了
11
2015-12-11 20:23:18 +08:00
所以为什么你要在 B 里面 insert A 的 view 呢?
SeanChense
2015-12-11 20:23:43 +08:00
你说的获取到之前那一个 vc ,是 addChildrenController 这个 vc 然后又 insert view 么?
SeanChense
2015-12-11 20:24:54 +08:00
@pupboss B 中没有对应方法应该报: unrecognized selector
LINAICAI
2015-12-11 20:26:57 +08:00
要把一个控制的 view 作为子 view 添加到另一个控制器里面前提是要把这个控制器 addChildrenController 到父视图的控制器的。
pupboss
2015-12-11 20:27:17 +08:00
@SeanChense 好像还真是。代码绑定事件有一个 addTarget ,一般写 self ,不过如果他这种情况呢?如果绑定的不是当前控制器,是 bad access 还是 unrecognized selector
SeanChense
2015-12-11 20:32:33 +08:00
@pupboss 我刚才也想说是 self 的问题。
不过既然是 bad access 那就是强引用了一个被回收的内存, addTarget 之后 button 会对 self 强引用。总之感觉在系统看来,此 self 非彼 self 。我知识有限,无法解释出缘由。
66450146
2015-12-11 22:21:23 +08:00
这个不是很明显的问题吗

ViewController A --(strong reference)--> View A
ViewController B --(strong reference)--> View B
View A --(strong reference)--> View B
App --(strong reference)--> ViewController A

但是没有任何 strong reference 指向 ViewController B ,它就被释放了
wohenyingyu01
2015-12-14 10:56:47 +08:00
@pupboss 有对应的方法,但是是空的,没有代码,确保不是代码造成的 bad access
wohenyingyu01
2015-12-14 10:58:59 +08:00
@11 只是想切换界面,不想用 tab , naviagtion 之类的比较明显的方式,因为是一个彩蛋……
wohenyingyu01
2015-12-14 11:00:08 +08:00
@SeanChense 并没有 addChildrenController ,而是直接 init 之后 insertSubView ,难道是这个原因
rim99
2015-12-14 11:19:22 +08:00
@wohenyingyu01 你应该看一下 container view 的文档: addChildrenController 之后,还要把子控制器的 View 添加到主控制器的子 view 里面,然后调用子 view ,让子控制器显示在需要的地方。
wohenyingyu01
2015-12-14 11:24:34 +08:00
@rim99 嗯嗯谢谢,确实是这个问题,因为如果只把 view insert 进去那 controller 就会被释放掉了
wohenyingyu01
2015-12-14 11:25:58 +08:00
@66450146 确实如此,新人这些概念还不是特别熟悉,谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/242873

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX