swift中类似火种的导航

Posted

技术标签:

【中文标题】swift中类似火种的导航【英文标题】:Tinder-like navigation in swift 【发布时间】:2016-10-31 20:23:32 【问题描述】:

我正在尝试使用this 框架,该框架提供了一个类似于 Tinder (Swift 3) 的导航栏。

我的目标是以透明的方式使用它 - 意思是 - 嵌入它并在情节提要上拥有 3 个独立的视图控制器,以及它们的 VC.swift 文件并使用 segues。

Here 是一个工作测试项目,具有 Tinder 风格和 Storyboard 中的 3 个 ViewController。

在我的项目中使用它之前,我想对其进行测试,所以我更新了这个项目。

正如我所见,nav 是具有 3 个 VC 并在它们之间切换的 UINavigationController。我想在故事板上看到他。

如此安装:

var nav: UINavigationController?

我在 UI builder 和 UINavigationController 类上创建了一个 UINavigationController,名为 MainNavigationController。

var nav: MainNavigationController?
nav = mainStb.instantiateViewController(withIdentifier: "mainNavigationController") as? MainNavigationController

我还向情节提要添加了一个简单的初始视图控制器,我从这个 VC(使用按钮)到 MainNavigationController:

@IBAction func buttonSegue(_ sender: Any) 
        setNav()

        self.performSegue(withIdentifier: "segue", sender: nil)
    

func setNav() 


    //// implement my logic (if logged in go to... if not go to...)

    instantiateControllers()
    setItems()

    let items = [UIImageView(image: chat),
                 UIImageView(image: gear),
                 UIImageView(image: profile)]

    let controllers = [oneVC!,
                       twoVC!,
                       threeVC!] as [UIViewController]

    controller = SLPagingViewSwift(items: items, controllers: controllers, showPageControl: false)

    setupController()


    nav = MainNavigationController(rootViewController: controller)
    appDelegate.window?.rootViewController = nav
    appDelegate.window?.makeKeyAndVisible()

到目前为止一切正常。 但是

我目前唯一的问题是我无法控制转场。在我添加的 3 个视图控制器中

override func prepare(for segue: UIStoryboardSegue, sender: Any?)

但它从来没有达到这个方法。我需要它在视图控制器之间传递数据。怎么办?

此外,您将如何通过点击一个元素(如按钮)来实现从一个视图控制器到另一个视图控制器的转场?如果我使用按钮设置一个常规的 segue,从一个 VC 到另一个 - 它显示没有导航栏的目标 VC

我上传了我当前的实现here。

任何帮助都会得到帮助。 谢谢。

【问题讨论】:

* 感谢 @DavidSeek 提供了 SLPagingView swift 3 版本中的代码以及带有 VC 的示例项目。 按钮方法中的 performSegueWithIdentifier 对您没有任何作用,因为您已经替换了 setNav 中的根视图控制器,并且您的视图现在位于情节提要环境“外部” 【参考方案1】:

好的。我已经下载了你的项目,因为你的解释没有真正的帮助..

首先:如果您的故事板只有空白屏幕,请为它们着色,以便其他编码人员能够更快地了解正在发生的事情。

您从黄色的VCUINavigationController 的转场已触发,但未使用,因为您以编程方式实例化了UINavigationController

// Sets the root
func setNav() 
    // here        
    nav = MainNavigationController(rootViewController: controller)
    appDelegate.window?.rootViewController = nav
    appDelegate.window?.makeKeyAndVisible()

从绿色 VC 到蓝色 VC 的转场没有任何意义,因为没有转场。这些控制器嵌入到同一个控制器中。 您正在设置 perform(forSegue 函数,但您从未调用它。如果有转场,你只使用perform(forSegue。但事实并非如此。

设置不带setNav()函数的按钮:

@IBAction func buttonSegue(_ sender: Any) 
    //setNav()
    self.performSegue(withIdentifier: "segue", sender: nil)

蓝色的VC 结果为单个VC

没有segue的相同功能,结果与segue相同。因为如前所述,无论如何您都以编程方式设置了所有内容:

@IBAction func buttonSegue(_ sender: Any) 
    setNav()
    //self.performSegue(withIdentifier: "segue", sender: nil)

由于您已在全局范围内实例化了 VCs,因此您可以在全局范围内获取/设置 VCs 值...

class OneVC: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
    

    @IBAction func passData(_ sender: Any) 
        let oneVCString = "This String is passed from OneVC"
        twoVC?.theLabel.text = oneVCString
    

结果:

Here is this on Github 作为你项目的一个分支。我还从AppDelegate 中删除了您的代码。没有用,无论如何都被调用了。你已经在 Interface Builder 中做了同样的事情。

最后但并非最不重要的是我的评论:清理你的代码!其他用户可能对此有不同的看法,但这不是我想与其他编码员合作的方式:

import UIKit

class TwoVC: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        print("from two to...")
        print(segue.identifier!)
    
    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    
    */


删除所有不必要的 cmets。

【讨论】:

感谢@DavidSeek,现在一切都清楚了。我刚刚在 func passData 的末尾添加了类似 segue 的行:“controller.setCurrentIndex(1, animated: false)”。这正是我需要向自己展示和理解的。我很抱歉质量和编码标准不佳。我仍然认为我自己对 swift 来说非常陌生。我很高兴收到您的一般 cmets 和提示。非常感谢。 这不是为了冒犯或拉你回来。我只是给你(在我的理解)有用的提示。既然问题已经回答了,请不要忘记接受,如果有帮助,请点赞。 他们很有帮助,正如我所说,@DavidSeek 你的建议总是受欢迎的。我提出了另一个(重要的)问题,如果你看一下会很高兴。谢谢:***.com/questions/40428075/… 嗨@DavidSeek 或其他观众。我在这里发布了一个与示例项目相关的问题:***.com/questions/40428075/… 我找不到如何实施我在我的上下文中找到的解决方案(SLPagingView)。如果有人可以看一下并提供帮助,我将不胜感激,谢谢!

以上是关于swift中类似火种的导航的主要内容,如果未能解决你的问题,请参考以下文章

Swift 全屏导航推送 Segue

Swift 中的复杂导航栈

IOS Swift:使用“返回”文本更新导航按钮

Swift 导航栏颜色

在 Swift 中更改导航栏颜色

Swift:强制在模态中显示导航栏