在三个视图控制器之间进行导航,这三个视图控制器都在一个选项卡视图中

时间:2019-05-15 11:11:57

标签: ios swift uinavigationcontroller uitabbarcontroller

我有一个标签栏视图。因此,三个选项卡之一是联系人应用程序。在该联系人应用程序中,共有三个页面,一个页面显示所有联系人,第二个页面显示在第一个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)
    }

1 个答案:

答案 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)
    }
}