请教一个类似网易云音乐 iOS 版 界面跳转问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
maitiantuzi
V2EX    问与答

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

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

    例如点击页面 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     Solana     4551 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 04:02 PVG 12:02 LAX 20:02 JFK 23:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86