V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
wohenyingyu01
V2EX  ›  问与答

iOS touchup inside 事件迷之崩溃

  •  
  •   wohenyingyu01 · Dec 11, 2015 · 2312 views
    This topic created in 3799 days ago, the information mentioned may be changed or developed.
    代码结构大概是这样,我在 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 replies    2015-12-14 11:25:58 +08:00
    MerenguesGeek
        1
    MerenguesGeek  
       Dec 11, 2015
    建议贴上代码看看, 可以试着设置 NSZombieEnabled 看看 log 信息。
    pupboss
        2
    pupboss  
       Dec 11, 2015
    粗略理解你是在 B 控制器里面强行塞进去了 A 控制器的 view ,先不说 [self.view insertSubview: xxxx atIndex:xxx] 这个有没有在最顶层,在 B 里面 点击 button , B 里面没有对应的方法,当然 bad access 了
    11
        3
    11  
       Dec 11, 2015
    所以为什么你要在 B 里面 insert A 的 view 呢?
    SeanChense
        4
    SeanChense  
       Dec 11, 2015
    你说的获取到之前那一个 vc ,是 addChildrenController 这个 vc 然后又 insert view 么?
    SeanChense
        5
    SeanChense  
       Dec 11, 2015
    @pupboss B 中没有对应方法应该报: unrecognized selector
    LINAICAI
        6
    LINAICAI  
       Dec 11, 2015
    要把一个控制的 view 作为子 view 添加到另一个控制器里面前提是要把这个控制器 addChildrenController 到父视图的控制器的。
    pupboss
        7
    pupboss  
       Dec 11, 2015
    @SeanChense 好像还真是。代码绑定事件有一个 addTarget ,一般写 self ,不过如果他这种情况呢?如果绑定的不是当前控制器,是 bad access 还是 unrecognized selector
    SeanChense
        8
    SeanChense  
       Dec 11, 2015
    @pupboss 我刚才也想说是 self 的问题。
    不过既然是 bad access 那就是强引用了一个被回收的内存, addTarget 之后 button 会对 self 强引用。总之感觉在系统看来,此 self 非彼 self 。我知识有限,无法解释出缘由。
    66450146
        9
    66450146  
       Dec 11, 2015   ❤️ 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
       Dec 14, 2015
    @pupboss 有对应的方法,但是是空的,没有代码,确保不是代码造成的 bad access
    wohenyingyu01
        11
    wohenyingyu01  
    OP
       Dec 14, 2015
    @11 只是想切换界面,不想用 tab , naviagtion 之类的比较明显的方式,因为是一个彩蛋……
    wohenyingyu01
        12
    wohenyingyu01  
    OP
       Dec 14, 2015
    @SeanChense 并没有 addChildrenController ,而是直接 init 之后 insertSubView ,难道是这个原因
    rim99
        13
    rim99  
       Dec 14, 2015   ❤️ 1
    @wohenyingyu01 你应该看一下 container view 的文档: addChildrenController 之后,还要把子控制器的 View 添加到主控制器的子 view 里面,然后调用子 view ,让子控制器显示在需要的地方。
    wohenyingyu01
        14
    wohenyingyu01  
    OP
       Dec 14, 2015
    @rim99 嗯嗯谢谢,确实是这个问题,因为如果只把 view insert 进去那 controller 就会被释放掉了
    wohenyingyu01
        15
    wohenyingyu01  
    OP
       Dec 14, 2015
    @66450146 确实如此,新人这些概念还不是特别熟悉,谢谢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5755 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 08:38 · PVG 16:38 · LAX 01:38 · JFK 04:38
    ♥ Do have faith in what you're doing.