V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MrLQX
V2EX  ›  iOS

ios 两个 ViewController 跳转相关问题咨询

  •  
  •   MrLQX · 2020-09-15 16:48:43 +08:00 · 2374 次点击
    这是一个创建于 1555 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 oc 写了两个 ViewController 界面,从 AViewController 跳转到 BViewController 使用了[self presentViewController:bVC animated:YES completion:nil]; 但是我想跳转的同时把 AViewController 销毁掉,使用[self dismissViewControllerAnimated:YES completion:nil];也无法实现,还有什么比较好的方法吗

    37 条回复    2020-09-16 11:31:49 +08:00
    MrLQX
        1
    MrLQX  
    OP
       2020-09-15 16:50:23 +08:00
    Android activity 跳转只需要 finsh 就好了,因为不怎么熟悉 ios,Google 了一天,也找不到比较好的方法
    xayoung
        2
    xayoung  
       2020-09-15 16:57:15 +08:00
    这样做的目的是什么?
    MrLQX
        3
    MrLQX  
    OP
       2020-09-15 17:01:55 +08:00
    @xayoung 登录界面有手机验证码和密码登录界面,跳转到密码登录界面的时候把手机验证码界面关闭了
    Lin0936
        4
    Lin0936  
       2020-09-15 17:05:58 +08:00
    push 到 B 然后把 root 替换成 B
    MrLQX
        5
    MrLQX  
    OP
       2020-09-15 17:09:26 +08:00
    @Lin0936 我试试
    baijiahei
        6
    baijiahei  
       2020-09-15 17:25:19 +08:00
    用 push 啊 present 是一些临时展示的或者临时设置界面才用这个吧
    CommandZi
        7
    CommandZi  
       2020-09-15 17:33:56 +08:00
    先 dismissA 再 presentB
    MrLQX
        8
    MrLQX  
    OP
       2020-09-15 17:34:25 +08:00
    @CommandZi 不行,这个试过了
    MrLQX
        9
    MrLQX  
    OP
       2020-09-15 17:37:20 +08:00
    @baijiahei 使用 NavigationController 才可以使用 push,目前我没有使用 NavigationController
    EggmanQ
        10
    EggmanQ  
       2020-09-15 17:41:21 +08:00
    父 VC: VC
    EggmanQ
        11
    EggmanQ  
       2020-09-15 17:41:45 +08:00
    靠, 按错了,
    kera0a
        12
    kera0a  
       2020-09-15 17:42:18 +08:00 via iPhone
    用 push
    现在 nav 的 viewControllers 里有 [root,A]
    然后 nav.serViewController([root,B])

    push 能自定义跳转动画,有个页面栈数组,可以随意调整
    CommandZi
        13
    CommandZi  
       2020-09-15 17:42:39 +08:00
    @MrLQX 肯定姿势错了,不要用 A presentB,用 A 的上一级
    EggmanQ
        14
    EggmanQ  
       2020-09-15 17:44:35 +08:00
    连续按错, 我觉得思路可以这样

    父 VC addChildVC: AVC, BVC

    父 VC.view addSubView: AVC.view, BVC.view

    然后可以自定义处理两个 View 的显示和动画, 数据和验证逻辑可以给到父 VC 处理
    frqk
        15
    frqk  
       2020-09-15 17:48:33 +08:00
    bVC 的实例是在 aVC 创建的话,不能在 bVC 移除 aVC 吧。
    要是 aVC 和 bVC 是在某个 VC 上的话,在 bVC 里 delegate 给那个 VC 让他把 aVC 移除了应该是可以的。
    codeisjobs
        16
    codeisjobs  
       2020-09-15 17:49:34 +08:00 via iPhone
    不要销毁 a 界面。等登录成功后重新设置 uiapplication 的 keywindow.rootviewcontroller 的时候再 dismiss a 界面
    codeisjobs
        17
    codeisjobs  
       2020-09-15 17:51:05 +08:00 via iPhone
    如果不想在 b 界面可以返回的话,就不设置左侧返回按钮,然后设置全屏显示。
    MrLQX
        18
    MrLQX  
    OP
       2020-09-15 17:53:15 +08:00
    @codeisjobs 我这边 a 界面右下角有个切换按钮,点击这个按钮可以跳转到 b 界面
    MrLQX
        19
    MrLQX  
    OP
       2020-09-15 17:54:37 +08:00
    @codeisjobs 主要是这个按钮跳转的实现,a 跳转到 b 的时候,销毁 a
    BabyYuuki
        20
    BabyYuuki  
       2020-09-15 17:56:16 +08:00
    你在 bVC 退出的时候,用 present AViewController 界面的那个控制器调用 dismissViewControllerAnimated 方法试试呢
    codeisjobs
        21
    codeisjobs  
       2020-09-15 17:58:21 +08:00 via iPhone
    @MrLQX 看你怎么跳的,present 方法的话,不好 dismiss,除非是用 rootviewcontroller 方式跳的
    codeisjobs
        22
    codeisjobs  
       2020-09-15 18:00:14 +08:00 via iPhone
    @MrLQX 推荐你 a 全屏 present b,然后登录完成后,重新设置 rootvc,同时 b 里面 dismiss
    Elethom
        23
    Elethom  
       2020-09-15 18:09:05 +08:00 via iPhone
    亲亲,这边建议您转行呢。
    isRealLeven
        24
    isRealLeven  
       2020-09-15 18:15:03 +08:00
    亲亲,这边建议您转行呢。
    MrStark
        25
    MrStark  
       2020-09-15 18:27:48 +08:00
    其实你可以把 A 和 B 都作为子控制器放在同一个控制器下进行切换操作的,这样就可以自由操作 A 和 B 的显示与释放了。
    MrLQX
        26
    MrLQX  
    OP
       2020-09-15 18:43:52 +08:00
    感谢各位大佬,我主要是 Android 开发,ios 只是被拉过来写的点东西
    sjsurf
        27
    sjsurf  
       2020-09-15 19:35:15 +08:00
    你可以考虑把 A 和 B 谁 present 颠倒一下。
    sjsurf
        28
    sjsurf  
       2020-09-15 19:37:25 +08:00
    刚才理解错误你的需求了。 如果你的需求是 A 或者 B 的关系的话 应该用 subViewController 然后改 view 的转场动画。
    yu5121199
        29
    yu5121199  
       2020-09-15 19:38:52 +08:00
    亲亲,这边建议您转行呢。
    superpeaser
        30
    superpeaser  
       2020-09-15 22:31:19 +08:00 via iPhone
    你这样设计就不合理呢,建议你看看主流的 app 关于验证码和密码登录切换的逻辑是怎么设计的…
    salor
        31
    salor  
       2020-09-16 00:46:36 +08:00 via iPhone
    VC 页面跳转子级不能销毁父级。你可以把两种验证方式作为两个视图,做好动画效果就行了。
    vincentxue
        32
    vincentxue  
       2020-09-16 06:29:41 +08:00
    你这个是安卓的思维,iOS 的世界不是这样搞。登录注册转主页是一个很常见的逻辑,A present 到 B,在 B 里面完成之后在 dismiss 的同时发个通知把 rootVC 给换掉就行了,这是最简单的做法。这样 B 在 dissmiss 之后就销毁了,A 在 root 被换了之后没有引用也自己销毁了。
    Building
        33
    Building  
       2020-09-16 07:30:36 +08:00 via iPhone
    将 AVC 作为子控制器添加到主控制器上,就可以 present BVC 后销毁掉 AVC 。
    canxden
        34
    canxden  
       2020-09-16 08:16:51 +08:00 via iPhone
    代码上 b push a,然后不要动画,登录完毕,a diss 要动画就好了…
    canxden
        35
    canxden  
       2020-09-16 08:20:01 +08:00 via iPhone
    如果一定要 a 到 b,再把 b 销毁,就切换 appdelegte 的 windows 的 rootvc,但是 a 和 b 不能是公用一个导航栏…
    laucenmi
        36
    laucenmi  
       2020-09-16 09:35:00 +08:00
    appDelegate.window?.rootViewController = newVC
    oldVC 会自己销毁,直接赋值没动画效果,有需要可以自己加上
    MarginK
        37
    MarginK  
       2020-09-16 11:31:49 +08:00
    你从 A present B 当然不可能销毁 A,因为只要 B 的视图层级没变,A 就永远都是 B 的 presentedViewController,你甚至还能从 A.presentedViewController 获取到 B

    还有,iOS 就不要去想着手动销毁页面的思维了,如果页面没有自动 dealloc 要么是你对使用的理解不对,要么是该 VC 中有东西释放不掉,请自己检查代码哦。

    楼主不想自己实现 present 动画的话,就换一个方式转场吧,楼上说的直接设置 window 的跟视图就是去了些动画,但能满足你的需求
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4084 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 05:19 · PVG 13:19 · LAX 21:19 · JFK 00:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.