Swift segue не делает того, что должен делать - PullRequest
0 голосов
/ 29 мая 2020

У меня небольшая проблема с переходом в мое приложение. Когда я пытаюсь установить sh переход так, чтобы у него была панель навигации, он правильно отображался в раскадровке, но не когда я пробую его на своем iPhone.

Это обзор пары контроллеров представления, в которых заключается моя проблема.

enter image description here

Предполагается, что это переход, поэтому вы можете видеть, что он имеет панель навигации и правильно расположен на раскадровке.

enter image description here

enter image description here

Это вид на iPhone. Нет панели навигации или ничего. Я перепробовал все, но, похоже, не нашел решения этой проблемы.

enter image description here

У кого-нибудь может быть проблема?

Небольшая дополнительная информация: я не знаю, может ли быть какое-то отношение к проблеме, но контроллер представления навигации не всегда присутствует только тогда, когда пользователь вошел в приложение. это решается на экране входа в систему, если пользователь не вошел в систему, пользователь увидит обычный экран входа в систему. В противном случае это будет go для навигации по контроллеру представления с отображением функции и self.present.

Вот код, который обрабатывает это действие.

 // Sees if the user is logged, If yes --> go to the account detail page else go to the account view.
    override func viewDidAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if let data = UserDefaults.standard.data(forKey: "User") {
            do {
                // Create JSON Decoder
                let decoder = JSONDecoder()
                // Decode Note
                _ = try decoder.decode(User.self, from: data)
                guard let loginVC = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier:
                        "AccountDetailViewController") as? AccountDetailViewController else { return }
                loginVC.modalPresentationStyle = .overCurrentContext
                self.present(loginVC, animated: false, completion: {})
            } catch {
                print("Unable to Decode Note (\(error))")
            }
        }
    }

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Вы должны push просмотреть контроллер вместо present. Пожалуйста, проверьте эту статью, чтобы узнать больше о Pushing, Popping, Presenting, & Dismissing ViewControllers


Вы можете сделать sh AccountDetailViewController без переходов. И вам не нужно вызывать performSegue(withIdentifier:) в tableView функцию didSelect.

  • Удалить переход из Interface Builder
let navigator = UINavigationController()

guard let loginVC = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier:
                        "AccountDetailViewController") as? AccountDetailViewController else { return }
loginVC.modalPresentationStyle = .overCurrentContext

navigator.pushViewController(loginVC, animated: true)
1 голос
/ 29 мая 2020

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

extension UIViewController {

    func pushVC(vcName : String) {
        let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: vcName)
        vc.hidesBottomBarWhenPushed = true
        self.navigationController?.pushViewController(vc, animated: true)
    }


    func pushVC(storyboardName : String, vcName : String)  {
        let vc = UIStoryboard.init(name: storyboardName, bundle: Bundle.main).instantiateViewController(withIdentifier: vcName)
        vc.hidesBottomBarWhenPushed = true
        self.navigationController?.pushViewController(vc, animated: true)
    }

    func popVC() {
        self.navigationController?.popViewController(animated: true)
    }

    func makeRootVC(storyBoardName : String, vcName : String) {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
         let vc = UIStoryboard(name: storyBoardName, bundle: Bundle.main).instantiateViewController(withIdentifier: vcName)
         let nav = UINavigationController(rootViewController: vc)
         nav.navigationBar.isHidden = true
         appDelegate.window?.rootViewController = nav // If using XCode 11 and above, copy var window : UIWindow? in your appDelegate file
         let options: UIView.AnimationOptions = .transitionCrossDissolve
         let duration: TimeInterval = 0.6
         UIView.transition(with: appDelegate.window!, duration: duration, options: options, animations: {}, completion: nil)
     }
}

Теперь в вашем случае, когда пользователь входит в систему, вы должны изменить свой root контроллер представления на AccountDetailViewController. Итак, сначала скопируйте и вставьте указанное выше расширение в любом месте вашего файла, а затем используйте его следующим образом:

 // Sees if the user is logged, If yes --> go to the account detail page else go to the account view.
    override func viewDidAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if let data = UserDefaults.standard.data(forKey: "User") {
            do {
                // Create JSON Decoder
                let decoder = JSONDecoder()
                // Decode Note
                _ = try decoder.decode(User.self, from: data)
                self.makeRootVC(storyBoardName : "Main", vcName :"AccountDetailViewController")
            } catch {
                print("Unable to Decode Note (\(error))")
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...