我正在尝试使用提供像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。
任何帮助都将被高峰化。 感谢。
答案 0 :(得分:1)
好。我已下载了您的项目,因为您的解释并非真有帮助..
首先:如果你有一个只有空白屏幕的故事板,请为其他编码人员着色,以便能够更快地告诉他们正在进行的事情。
您从黄色VC
到UINavigationController
的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
。
没有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.
}
*/
}
删除所有不必要的评论。