Swift - приложение вылетает после установки UserDefaults - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь реализовать функцию «всегда в системе» в моем приложении. Проблема в том, что, если я перезапускаю свое приложение, оно падает. Вот что я сделал:

set Userdefault:

@objc func loginButtonTapped(_ sender: Any) {

    let email = self.emailTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    let password = self.passwordTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    // start button animation
    loginButton.startAnimation()

    let qualityOfServiceClass = DispatchQoS.QoSClass.background
    let backgorundQueue = DispatchQueue.global(qos: qualityOfServiceClass)
    backgorundQueue.async {
        // check if account details correct
        Auth.auth().signIn(withEmail: email, password: password) { (result, error) in

            if error != nil {
                DispatchQueue.main.async {
                    // error -> stop animation
                    self.loginButton.stopAnimation(animationStyle: .shake, revertAfterDelay: 0) {
                        self.errorLabel.text = error!.localizedDescription
                        self.errorLabel.alpha = 1
                    }
                }
            }else {
                // correct acount details -> login
                DispatchQueue.main.async {
                    UserDefaults.standard.set(true, forKey: "isLoggedIn")
                    UserDefaults.standard.synchronize()
                    // transition to home ViewController
                    self.transitionToHome()
                }
            }
        }
    }
}

проверка UserDefault:

class MainNavigationControllerViewController: UINavigationController {

override func viewDidLoad() {
    super.viewDidLoad()

    if isLoggedIn() {
        let homeController = MainViewController()
        viewControllers = [homeController]
    }
}

fileprivate func isLoggedIn() -> Bool {
    return UserDefaults.standard.bool(forKey: "isLoggedIn")
}

}

Пользователь входит в систему через Firebase, и все данные хранятся в Cloud Firestore.

Ошибка

cell.customWishlistTapCallback = {

            let heroID = "wishlistImageIDX\(indexPath)"
            cell.theView.heroID = heroID

            let addButtonHeroID = "addWishButtonID"
            self.addButton.heroID = addButtonHeroID

            // track selected index
            self.currentWishListIDX = indexPath.item

            let vc = self.storyboard?.instantiateViewController(withIdentifier: "WishlistVC") as? WishlistViewController

            vc?.wishList = self.dataSourceArray[self.currentWishListIDX]
            // pass drop down options
            vc?.theDropDownOptions = self.dropDownButton.dropView.dropDownOptions
            vc?.theDropDownImageOptions = self.dropDownButton.dropView.dropDownListImages
            // pass current wishlist index
            vc?.currentWishListIDX = self.currentWishListIDX
            // pass the data array
            vc?.dataSourceArray = self.dataSourceArray
            // set Hero ID for transition
            vc?.wishlistImage.heroID = heroID
            vc?.addWishButton.heroID = addButtonHeroID
            // allow MainVC to recieve updated datasource array
            vc?.dismissWishDelegate = self

            vc?.theTableView.tableView.reloadData()
            self.present(vc!, animated: true, completion: nil)

        }

Тема 1: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0)

в строке:

let v c = self.storyboard? .InstantiateViewController (withIdentifier: "WishlistV C") as! WishlistViewController

Думаю, это не так просто, как я думал. Кто-нибудь знает, почему приложение вылетает и как я могу это решить? :)

1 Ответ

1 голос
/ 24 января 2020

Вы создаете свой экземпляр MainViewController, используя простой инициализатор (MainViewController()), а не создаете его экземпляр из раскадровки. В результате любые свойства @IBOutlet будут иметь значение nil, поскольку именно процесс раскадровки распределяет эти экземпляры объектов и присваивает их свойствам.

Вам необходимо добавить идентификатор в основной контроллер представления. сцена (если она еще не создана) и использовать ее для создания экземпляра контроллера представления. Например, если предположить, что идентификатором сцены является «MainScene», у вас будет что-то вроде:

override func viewDidLoad() {
    super.viewDidLoad()

    if isLoggedIn() {
        let homeController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("MainScene") 
        viewControllers = [homeController]
    }
}

cra sh в вашем обновленном вопросе означает, что либо сцена с идентификатором WishlistVC не имеет своего класса установите на WishlistViewController или он не найден, так что принудительное снижение происходит сбой.

...