我有一个标签栏视图。因此,三个选项卡之一是联系人应用程序。在该联系人应用程序中,共有三个页面,一个页面显示所有联系人,第二个页面显示在第一个VC中选择的一个特定联系人,第三个页面添加一个新联系人。 (与内置的iOS应用程序非常相似)如何在这三个页面之间创建流畅的流程。 (不要忘记它们应该在一个标签栏中)
我已经添加了所有必需的按钮。
我已嵌入3个导航视图控制器(3页中的每一个)
第一页具有“添加”按钮,该按钮应指向第三页。 第二页有两个按钮,一个返回第一页,另一个返回第三页。 第三个按钮有两个按钮,每个按钮分别进入其他两个页面。
我已使用此功能通过编程在导航栏中创建了这些按钮-
override func viewDidAppear(_ animated: Bool) {
navigationItem.title = "Add New Contact"
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.plain, target: self, action: #selector(theTransition))
}
@objc func theTransition() {
let second = self.storyboard?.instantiateViewController(withIdentifier: "OneNavID") as! OneNavigationViewController
self.present(second, animated: true, completion: nil)
}
(上面的代码是从第3页跳至第1页的示例)
这些按钮正常工作,但它们显示一个新页面,该页面不在选项卡栏控制器中。 我希望他们留在选项卡视图内。请帮助!请问您对这个问题是否有任何疑问。我已经尽力用简单和简短的词来解释它。 我已经在互联网上查看了很多东西,但是找不到任何实例,其中三个视图控制器中的每一个都有一个导航控制器(我认为这是必需的,因为它们每个人都有去往/来自其他页面的链接)
第二页-
override func viewDidAppear(_ animated: Bool) {
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Edit", style: UIBarButtonItem.Style.plain, target: self, action: #selector(theTransition))
}
@objc func theTransition() {
let second = self.storyboard?.instantiateViewController(withIdentifier: "ThreeNavID") as! ThreeNavigationViewController
self.present(second, animated: true, completion: nil)
}
第三页-
override func viewDidAppear(_ animated: Bool) {
navigationItem.title = "Add New Contact"
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.plain, target: self, action: #selector(theTransition))
}
@objc func theTransition() {
let second = self.storyboard?.instantiateViewController(withIdentifier: "NavID") as! NavigationViewController
self.present(second, animated: true, completion: nil)
}
答案 0 :(得分:1)
请勿使用3个导航控制器。使用这样的一个导航控制器
UITabBarController_____ Another View Controller1
|
|____ Another View Controller2
|
|____ Contact - UINavigationController -- FirstPage
UINavigationController -- FirstPage --> SecondPage --> ThirdPage
将第一页嵌入导航控制器,并将push嵌入第二页和第三页。不要为第一页创建新实例。使用popViewController转到上一个视图控制器。
您可以使用pushViewController将数据传递到下一个视图控制器,并使用自定义委托或闭包将数据发送到上一个视图控制器。或者在像这样的自定义导航控制器类中创建一个变量
class CustomNavigationController: UINavigationController {
var name: String?
}
然后从这样的其他视图控制器读取和写入数据
class FirstPage: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print((self.navigationController as? CustomNavigationController)?.name)
(self.navigationController as? CustomNavigationController)?.name = "FirstPage"
}
@objc func goToSecondPage() {
if let secondPage = self.storyboard?.instantiateViewController(withIdentifier: "SecondPage") as? SecondPage {
self.navigationController?.pushViewController(secondPage, animated: true)
}
}
@objc func goToThirdPage() {
if let thirdPage = self.storyboard?.instantiateViewController(withIdentifier: "ThirdPage") as? ThirdPage {
self.navigationController?.pushViewController(thirdPage, animated: true)
}
}
}
class SecondPage: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print((self.navigationController as? CustomNavigationController)?.name)
(self.navigationController as? CustomNavigationController)?.name = "SecondPage"
}
@objc func goToThirdPage() {
if let thirdPage = self.storyboard?.instantiateViewController(withIdentifier: "ThirdPage") as? ThirdPage {
self.navigationController?.pushViewController(thirdPage, animated: true)
}
}
@objc func goToFirstPage() {
self.navigationController?.popViewController(animated: true)
}
}
class ThirdPage: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print((self.navigationController as? CustomNavigationController)?.name)
(self.navigationController as? CustomNavigationController)?.name = "ThirdPage"
}
@objc func goToFirstPage() {
self.navigationController?.popToRootViewController(animated: true)
}
@objc func goToSecondPage() {
self.navigationController?.popViewController(animated: true)
}
}