V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wohenyingyu01
V2EX  ›  问与答

iOS touchup inside 事件迷之崩溃

  •  
  •   wohenyingyu01 · 2015-12-11 17:19:59 +08:00 · 1961 次点击
    这是一个创建于 3277 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码结构大概是这样,我在 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 ,怎么破……

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

    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
        10
    wohenyingyu01  
    OP
       2015-12-14 10:56:47 +08:00
    @pupboss 有对应的方法,但是是空的,没有代码,确保不是代码造成的 bad access
    wohenyingyu01
        11
    wohenyingyu01  
    OP
       2015-12-14 10:58:59 +08:00
    @11 只是想切换界面,不想用 tab , naviagtion 之类的比较明显的方式,因为是一个彩蛋……
    wohenyingyu01
        12
    wohenyingyu01  
    OP
       2015-12-14 11:00:08 +08:00
    @SeanChense 并没有 addChildrenController ,而是直接 init 之后 insertSubView ,难道是这个原因
    rim99
        13
    rim99  
       2015-12-14 11:19:22 +08:00   ❤️ 1
    @wohenyingyu01 你应该看一下 container view 的文档: addChildrenController 之后,还要把子控制器的 View 添加到主控制器的子 view 里面,然后调用子 view ,让子控制器显示在需要的地方。
    wohenyingyu01
        14
    wohenyingyu01  
    OP
       2015-12-14 11:24:34 +08:00
    @rim99 嗯嗯谢谢,确实是这个问题,因为如果只把 view insert 进去那 controller 就会被释放掉了
    wohenyingyu01
        15
    wohenyingyu01  
    OP
       2015-12-14 11:25:58 +08:00
    @66450146 确实如此,新人这些概念还不是特别熟悉,谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2580 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:50 · PVG 11:50 · LAX 19:50 · JFK 22:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.