迅速的火种式导航

时间:2016-10-31 20:23:32

标签: ios swift xcode

我正在尝试使用提供像Tinder(Swift 3)这样的导航栏的this框架。

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

Here是一个有Tinder风格的工作测试项目和来自Storyboard的3个ViewControllers。

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

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

如此绝对:

var nav: UINavigationController?

我在UI构建器和UINavigationController类上创建了一个名为MainNavigationController的UINavigationController。

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

我还在故事板中添加了一个简单的初始视图控制器,从这个VC i segue(使用按钮)到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()
}
到目前为止,这一切都有效。的 BUT

我目前唯一的问题是我对segue没有控制权。在我添加的3个视图控制器中

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

但它永远不会达到这种方法。我需要它在视图控制器之间传递数据。怎么办呢?

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

我上传了我当前的实施here

任何帮助都将被高峰化。 感谢。

1 个答案:

答案 0 :(得分:1)

好。我已下载了您的项目,因为您的解释并非真有帮助..

首先:如果你有一个只有空白屏幕的故事板,请为其他编码人员着色,以便能够更快地告诉他们正在进行的事情。

enter image description here

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

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

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

设置不带setNav()功能的按钮:

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

蓝色VC的结果为单VC

enter image description here

没有segue的相同函数产生与segue相同的逻辑。因为如上所述,无论如何都要以编程方式设置所有内容:

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

enter image description here

由于您已全局实例化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
    }
}

结果:

enter image description here

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.
    }
    */

}

删除所有不必要的评论。