Навигация между тремя контроллерами представления, где все три из них находятся в одном представлении панели вкладок - PullRequest
1 голос
/ 15 мая 2019

У меня есть вид панели вкладок.При этом одна из трех вкладок - это приложение контактов.В этом приложении контактов есть три страницы: одна для отображения всех контактов, вторая для отображения одного конкретного контакта, выбранного в первом ВК, и третья для добавления нового контакта.(Во многом похоже на встроенное приложение для 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 Ответ

1 голос
/ 15 мая 2019

Не используйте 3 навигационных контроллера. Используйте один навигационный контроллер, как этот

UITabBarController_____ Another View Controller1 
                  |  
                  |____ Another View Controller2
                  |  
                  |____ Contact - UINavigationController -- FirstPage

UINavigationController -- FirstPage --> SecondPage --> ThirdPage

Вставить первую страницу в контроллер навигации и нажать вторую и третью страницы. Не создавайте новый экземпляр для первой страницы. Используйте 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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...