Как удалить элементы панели навигации, когда контроллер представления удален из стека навигации? - PullRequest
0 голосов
/ 03 июня 2019

Я удаляю контроллер вида входа из стека навигации после входа пользователя в систему. Однако элементы панели навигации, добавленные контроллером вида входа в систему, все еще остаются.Как полностью удалить контроллер представления из стека навигации?

static func removePreviousFromNavigationStack(_ navVC: UINavigationController) {
    var navArr = navVC.viewControllers
    for elem in navArr {
        if elem.isKind(of: LoginViewController.self) {
            if let vc = StateData.loginVC {
                vc.navigationItem.leftBarButtonItem = nil  // is not working as intended
                vc.navigationItem.rightBarButtonItem = nil
                vc.navigationItem.title = "Foo"
            }
            //elem.removeFromParent()
        }
    }
    navArr.remove(at: navArr.count - 2)
    navVC.viewControllers = navArr
}

Flow: HomeVC -> ApplyVC -> LoginVC -> FormVC

После входа в систему FormVC я вызываю метод remove для удаления LoginVCиз стека.Это удаляет VC, но кнопки навигации остаются.Если я установлю кнопку навигации на ноль, ApplyVC * leftButtonItem, кнопка "назад", элемент правой кнопки, кнопка "home" не отображается.Имеется прозрачная кнопка «назад», при нажатии на которую отображаются кнопки панели навигации ApplyVC, как если бы LoginVC выскочил из вида, но без каких-либо изменений в текущем представлении.

screens

1 Ответ

2 голосов
/ 03 июня 2019

Попробуйте удалить LoginVC во время нажатия FormVC вместо того, чтобы видеть FormVC.

Я создал тот же NavigationStack, что и ваш.

1. Добавлено rightBarButton в HomeVC

class HomeVC: UIViewController {
    var rightBarItem: UIBarButtonItem = {
        return UIBarButtonItem(barButtonSystemItem: .bookmarks, target: nil, action: nil)
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "HomeVC"
        self.navigationItem.rightBarButtonItem = rightBarItem
    }
}

class ApplyVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "ApplyVC"
    }
}

2. Добавлено rightBarItem в LoginVC

class LoginVC: UIViewController {
    var rightBarItem: UIBarButtonItem = {
        return UIBarButtonItem(barButtonSystemItem: .add, target: nil, action: nil)
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "LoginVC"
        self.navigationItem.rightBarButtonItem = rightBarItem
    }

    @IBAction func onTapButton(_ sender: UIButton) {
        var controllers = self.navigationController?.viewControllers
        let formVC = self.storyboard?.instantiateViewController(withIdentifier: "FormVC") as! FormVC
        controllers?.removeAll(where: { $0 is LoginVC })
        controllers?.append(formVC)
        if let controllers = controllers {
            self.navigationController?.setViewControllers(controllers, animated: true)
        }
    }
}

В приведенном выше коде я отфильтровал LoginVC и добавил FormVC из navigationController’s viewControllers array.

class FormVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "FormVC"
    }
}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...