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

请教一个类似网易云音乐 iOS 版 界面跳转问题

  •  
  •   maitiantuzi · 2016-10-12 11:07:27 +08:00 · 2516 次点击
    这是一个创建于 2969 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如点击页面 a 的一首歌曲,跳转到播放页面 b ,然后在播放页面 b 跳转到歌手页面 c ,在歌手页面 c 点击一首歌曲播放,此时跳转到播放页面 d 。 我的问题是在页面 d ,点击返回到页面 c ,再点击返回时如何像网易云音乐一样直接跳过播放页面 b ,会到页面 a 。

    示意图: a->b->c->d 点击返回: d->c->a

    28 条回复    2016-12-20 15:26:05 +08:00
    kera0a
        1
    kera0a  
       2016-10-12 11:46:54 +08:00   ❤️ 1
    跳转到页面 a
    此时 viewControllers 数组中 [a]
    ...
    跳转到 c 数组中 [a,b,c]

    跳转到 d 不用 push 方法,
    将当前 Nav 中的 viewControllers 数组 [a,b,c]取出,删除掉 b,添加一个 d ,
    得到数组 [a,c,d]
    使用 setViewControllers 方法,传递一个这个数组即可。

    之后返回就是 d->c->a
    loveuqian
        2
    loveuqian  
       2016-10-12 12:09:33 +08:00 via iPhone
    看楼上回复
    貌似是位大神
    rayshen
        3
    rayshen  
       2016-10-12 18:02:52 +08:00   ❤️ 1
    说这么多不知道你问什么。。。。
    1L 就更是不知所云。。。
    pop 函数本身支持 pop 到任意一个 controller ,建议看看官方文档
    isweal
        4
    isweal  
       2016-10-12 20:37:46 +08:00
    @rayshen 如果要支持从 c 滑动返回 a 的话。。。
    finab
        5
    finab  
       2016-10-13 10:47:15 +08:00
    @rayshen 你不懂, 1 楼才是正确答案
    rayshen
        6
    rayshen  
       2016-10-13 11:09:26 +08:00
    @finab 不就是在 pop 前把前面一个 controller delete 掉吗,你不会觉得很高端吧
    rayshen
        7
    rayshen  
       2016-10-13 11:09:43 +08:00
    @finab push 前
    rayshen
        8
    rayshen  
       2016-10-13 11:11:38 +08:00
    @finab 官方既然有提供现成的 pop API ,直接去用比较好
    rayshen
        9
    rayshen  
       2016-10-13 11:14:59 +08:00
    @isweal 官方的返回手势和栈顺序相关,如果要支持手势返回,那就需要清理栈了,至于在什么时候清理,其实都是可以的,
    哪怕是已经 push 到 d 了,还是可以把 b 给删掉
    finab
        10
    finab  
       2016-10-13 11:35:39 +08:00   ❤️ 1
    @rayshen 1 楼都给出最简单实现的,调整页面栈,使用 setViewControllers 代替 Push 。
    这里不是用 pop 能解决的,这里的主要问题就是把某个页面从栈中删除,和 pop 方法没关系,
    Pop 不能删除某个页面的堆栈,能删除的只有 setViewControllers 用一个新的 Array 。
    Nav 的 ViewControllers 数组是个 不可修改的 NSArray ,如果不使用 setViewControllers 跳转,那么之后调整,还是得有一次 setViewControllers 做调整 ,而且你也很难找到合适的机会去调整。

    再结合你 4 楼的言论,就知道你不懂,我这样说有错?
    finab
        11
    finab  
       2016-10-13 11:38:21 +08:00
    @rayshen 如果你想继续讨论,请直接上代码吧,你只用 pop 去实现网易云音乐那种效果,否则就到此为止,别浪费大家宝贵的时间
    rayshen
        12
    rayshen  
       2016-10-13 11:51:05 +08:00
    @finab pop 方法本身就是删除堆栈,怎么叫 pop 不能删除堆栈? pop 到某个特定的界面就是删除堆栈中的多个 controller 。 setViewController ,只是一个很普通的函数,我不知道你说的“很难找到合适的机会”是指什么?
    4L 提出的 C 滑动返回 A 又是另外一个需求,如果你逻辑还清楚的话,就知道并不能混为一谈。
    假如 C 有需求返回支持多个界面,直接返回到 B ,点击某个返回首页到 A ,而你早已经把 B 删了,那你是不是就懵逼了?
    rayshen
        13
    rayshen  
       2016-10-13 11:54:18 +08:00
    @finab 问题太简单,也没必要讨论。做开发时,只有适合的场景,没有唯一的技术。
    finab
        14
    finab  
       2016-10-13 12:07:35 +08:00
    @rayshen
    楼主的需求就是 C 滑动返回到 A ,网易云音乐那个效果也是这样,用 pop 不能实现。
    1 楼就给出这个需求的直接解决方案。
    你却说 1 楼是错的,提出用 POP 。
    我说了你说错了, pop 不能解决楼主的需求。

    不要扯有的没的的东西,你提出的新需求 是两个按钮,按钮当然随便能点,但是返回只有一个操作
    既然简单,直接上代码呗,用 pop 做出这个效果
    finab
        15
    finab  
       2016-10-13 12:08:43 +08:00
    @rayshen 不想再听你说了,不知所云。
    直接上代码,瞎比比有啥用
    rayshen
        16
    rayshen  
       2016-10-13 12:22:48 +08:00
    @finab popToViewController(),一句函数完美解决 C 到 A 的问题,你瞎逼逼扯那么多有的没的,不就是为了强调要提前删 b ?谁说一定要删 b 了?楼主提到的内容,需求仅仅是要实现的是网易云音乐的“点击返回” C 到 A ,何必把问题复杂化搞得人家不知所云。
    rayshen
        17
    rayshen  
       2016-10-13 12:24:57 +08:00
    @finab 另外我可没说 1L 错,你可别诬陷我。
    rayshen
        18
    rayshen  
       2016-10-13 12:26:28 +08:00
    @finab 到此为止吧,我知道你为了钻网易云音乐这个牛角尖煞费苦心,我劝你还是别浪费宝贵时间了
    finab
        19
    finab  
       2016-10-13 12:28:03 +08:00
    @rayshen 你的意思是用户只有点击后退 才能正确回到 A ,而滑动返回就随便咯? 你们公司做事就是这么随意的吗?
    点后退返回到 A ,滑动返回却回到了 B ?
    这算 BUG 吗?
    而且网易云音乐播放页面是个单例 , D 其实就是 B 。

    一点脑子都没有~
    rayshen
        20
    rayshen  
       2016-10-13 12:34:37 +08:00
    @finab 是啊,我的公司做事是随意啊,起码在全中国还算比较随意的。。哈哈。。
    至于网易云音乐,我都说了你就别钻这个牛角尖了。

    谁说点击返回和滑动一定要一致的哈哈?返回按钮可以代表的是返回到首页,滑动返回是到前一个界面。

    你们公司是不是都是只做技术,不懂产品的?
    finab
        21
    finab  
       2016-10-13 12:36:30 +08:00
    @rayshen 那看来你们公司也就如此了,你也就只是这样的水准了
    rayshen
        22
    rayshen  
       2016-10-13 12:37:44 +08:00
    @finab 对于你这种屌丝程序员我无能为力,多去看看不同的产品吧
    finab
        23
    finab  
       2016-10-13 12:37:48 +08:00
    @rayshen 我公司估计是只做技术吧,不过我们老板还养猪。
    就这样,懒得跟你说,停止!浪费我时间
    rayshen
        24
    rayshen  
       2016-10-13 12:40:59 +08:00
    @finab 毕竟猪场厉害的是产品,并非技术
    rayshen
        25
    rayshen  
       2016-10-13 12:45:31 +08:00 via iPhone
    @finab 华为就比较随意
    jackisnotspirate
        26
    jackisnotspirate  
       2016-10-13 13:10:17 +08:00
    那这种逻辑也挺奇怪的吧。
    wohenyingyu01
        27
    wohenyingyu01  
       2016-10-13 15:08:25 +08:00
    界面 b 和界面 c 用 insertSubView 的方式进行切换,而不是 push ,界面 d 再用 push 进来就行了吧?不知道我的理解对不对。
    maitiantuzi
        28
    maitiantuzi  
    OP
       2016-12-20 15:26:05 +08:00
    谢谢大家回复,本人发现网易云音乐 iOS 版和 android 版实现机制并不一样,其它 app 类似的逻辑也各有不同。
    我的解决方案是参考国外一个 app ,当点击歌曲播放时, present 出播放页面的 controller ,在播放页面点击歌手页面时, dismiss 掉这个页面,然后 present 出下一个页面,完美避免了页面管理的问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3379 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 11:49 · PVG 19:49 · LAX 03:49 · JFK 06:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.