Nano Hash - криптовалюты, майнинг, программирование

Как выполнить вход / регистрацию и выход из системы, используя пользовательские настройки по умолчанию в Swift?

у меня есть scenedelegate, appdelegate, signinVC, signupVC и homeVC

поток viewcontroller, как показано ниже

      UINavigationController(initialVC) ->SigninVC (signin and signup buttons) -> homeVC(logoutBtn)

мне нужно, когда я вхожу в систему или регистрируюсь, мне нужно переместить homeVC, и если я выхожу из системы, мне нужно вернуться в loginVC, и мне нужен автоматический вход пользователя, пока я не нажму кнопку выхода в homeVC

в подпискеВК:

  class RegisterViewController: UIViewController {
@IBOutlet weak var firstNameTextfield: UITextField!
@IBOutlet weak var lastNameTextfield: UITextField!
@IBOutlet weak var emailTextfield: UITextField!
@IBOutlet weak var passwordTextfield: UITextField!

@IBAction func registerBtnClicked(_ sender: Any) {
    
    if firstNameTextfield.text?.isEmpty == true{
        self.showAlert(title: "Registration", message: "please enter first name")

    }
    else if lastNameTextfield.text?.isEmpty == true{
        self.showAlert(title: "Registration", message: "please enter last name")

    }else if emailTextfield.text?.isEmpty == true{
        self.showAlert(title: "Registration", message: "please enter email")

    }else if passwordTextfield.text?.isEmpty == true{
        self.showAlert(title: "Registration", message: "please enter password")

    }
    else{
        UserDefaults.standard.set(firstNameTextfield.text, forKey: "userName")
                UserDefaults.standard.set(lastNameTextfield.text, forKey: "lastName")
                UserDefaults.standard.set(emailTextfield.text, forKey: "email")
                UserDefaults.standard.set(passwordTextfield.text, forKey: "userPassword")
        
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
         navigationController?.pushViewController(vc, animated: true)
        
    }
}

в логинВК:

class ViewController: UIViewController {
@IBOutlet weak var userNameTextfield: UITextField!
@IBOutlet weak var passwordTextfield: UITextField!
@IBAction func loginBtnClicked(_ sender: Any) {
    
    let uName = UserDefaults.standard.string(forKey: "userName")
    
    let uPassword = UserDefaults.standard.string(forKey: "userPassword")

    if userNameTextfield.text == uName && passwordTextfield.text == uPassword{
        UserDefaults.standard.set(true, forKey: "USER_LOGIN")

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
         navigationController?.pushViewController(vc, animated: true)
    }
    else{
        showAlert(title: "LogIn", message: "please enter username and password")
    }
}

@IBAction func registerBtnClicked(_ sender: Any) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: "RegisterViewController") as! RegisterViewController
     navigationController?.pushViewController(vc, animated: true)
}
}

в домашнем ВК:

class HomeViewController: UIViewController {

@IBAction func logoutBtnClicked(_ sender: Any) {
    UserDefaults.standard.set(false, forKey: "USER_LOGIN") //logging session off

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
     navigationController?.pushViewController(vc, animated: true)
}
}

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

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


Ответы:


1

В signinVC добавьте следующую строку в viewDidLoad

if UserDefaults.standard.bool(forKey: "USER_LOGIN"){
            //navigate to home page
            DispatchQueue.main.async {
                let storyboard = UIStoryboard(name: "Main", bundle: nil)
                let vc = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
                navigationController?.pushViewController(vc, animated: true)
            }
        }

Измените signupVC, как показано ниже.

class RegisterViewController: UIViewController {
@IBOutlet weak var firstNameTextfield: UITextField!
@IBOutlet weak var lastNameTextfield: UITextField!
@IBOutlet weak var emailTextfield: UITextField!
@IBOutlet weak var passwordTextfield: UITextField!

    
var userDict : Dictionary<String,UserData>?
    
@IBAction func registerBtnClicked(_ sender: Any) {
    
    if firstNameTextfield.text?.isEmpty == true{
        self.showAlert(title: "Registration", message: "please enter first name")

    }
    else if lastNameTextfield.text?.isEmpty == true{
        self.showAlert(title: "Registration", message: "please enter last name")

    }else if emailTextfield.text?.isEmpty == true{
        self.showAlert(title: "Registration", message: "please enter email")

    }else if passwordTextfield.text?.isEmpty == true{
        self.showAlert(title: "Registration", message: "please enter password")

    }
    else{
        self.userDict = UserDefaults.standard.dictionary(forKey: "UserList") as! Dictionary<String, RegisterViewController.UserData>
        
        let userData = UserData(userName: firstNameTextfield.text, lastName: lastNameTextfield.text, email: emailTextfield.text, userPassword: passwordTextfield.text)
        self.userDict[firstNameTextfield.text] = userData
        
        UserDefaults.standard.setValue(self.userDict, forKey: "UserList")
        
        DispatchQueue.main.async {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let vc = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
             navigationController?.pushViewController(vc, animated: true)
        }
        
        
    }
}

struct UserData {
    var userName : String
    var lastName : String
    var email : String
    var userPassword : String
}

Наконец, измените метод loginBtnClicked следующим образом.

@IBAction func loginBtnClicked(_ sender: Any) {
    
     let userDict = UserDefaults.standard.dictionary(forKey: "UserList") as! Dictionary<String, UserData>
    
    guard let usrData = userDict[userNameTextfield.text] as! UserData else {
        // no user registered with this user name
        return
    }
    
    if usrData.userPassword == passwordTextfield.text {
        // login successfull
        UserDefaults.standard.set(true, forKey: "USER_LOGIN")
        DispatchQueue.main.async {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let vc = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
             navigationController?.pushViewController(vc, animated: true)
        }
             
    }else{
        //login failed
        showAlert(title: "LogIn", message: "please enter username and password")
    }
    
}
28.01.2021
  • спасибо за ответ :) я могу автоматически войти в систему .. но проблема в том, что только недавно зарегистрированный пользователь может войти в систему .. но уже зарегистрированные остальные пользователи, он переходит к signinVC loginbtn еще часть предупреждения .. пожалуйста, сделайте что-нибудь с кодом .. где я должен изменить 28.01.2021
  • не могли бы вы предложить мне код .. я проголосую и приму ваш ответ 28.01.2021
  • дай мне 5 мин. я понял твою мысль.. 28.01.2021
  • Поскольку вы сохраняете имя пользователя, имя, адрес электронной почты с одним и тем же ключом каждый раз. Раз за разом в вашем приложении сохраняется только информация о пользователе. каждый раз, когда вы регистрируете нового пользователя, данные последнего заменяются новыми. для этого вам нужно поддерживать несколько пользовательских данных в списке или словаре 28.01.2021
  • дайте мне знать, хотите ли вы поместить данные в список. Затем я закодирую его. 28.01.2021
  • да, мне нужно, чтобы каждый зарегистрированный пользователь вошел в систему .. пожалуйста, поделитесь кодом 28.01.2021
  • я изменил ответ в соответствии с вашими потребностями 28.01.2021
  • «UserData» не является типом члена «RegisterViewController» 28.01.2021
  • проверить полный singupVC. ниже есть структура с именем UserData. добавьте это также в ваш код. 28.01.2021
  • я добавил структуру... та же ошибка в loginvc 28.01.2021
  • затем создайте новый файл Swift с именем user data. и вставьте структуру в этот файл 28.01.2021

  • 2

    Я определенно рекомендую вам прочитать несколько статей об архитектуре MVC или MVVM :) (https://marcosantadev.com/mvvmc-with-swift/) ‹- Пример.

    Я понимаю, что, возможно, вы просто ожидаете ответа на свой вопрос, поэтому самый простой ответ (и не правильный подход !!):

    Вы можете просто сохранить параметр bool в userDefaults, который будет указывать, вошел ли пользователь в систему или нет. ()

    Как только вы запустите свое приложение, вы можете проверить, существует ли параметр в UserDefaults, и в зависимости от этого вы переместите пользователя к нужному контроллеру.

    Также вы можете добавить наблюдателя, если значение в UserDefaults изменится, и в соответствии с этим изменением вы снова сможете увести пользователя.

    Как я упоминал ранее, я не уверен, что вы создаете (будь то какое-то приложение или просто обучение), но определенно читал некоторые статьи об архитектурах и пытался их использовать :) Удачи на вашем пути изучения iOS-разработки.

    28.01.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..