在 iOS 应用程序中创建帐户原型时遇到问题

Posted

技术标签:

【中文标题】在 iOS 应用程序中创建帐户原型时遇到问题【英文标题】:Having issues prototyping account creation in iOS app 【发布时间】:2020-12-29 21:46:59 【问题描述】:

我从 8 月开始学习 ios 开发,现在才开始开发我的第一个应用程序。在我远程知道如何开发我的应用程序之前,我一直在创建具有 MINIMAL 功能的小型原型应用程序,只是为了了解如何完成我实际产品的一部分。现在我被困在一个项目上,该项目只是创建一个帐户并将其存储在一个数组中以供以后使用,即在“我的个人资料”页面上显示数据模型对象及其各种属性;

更具体地说,我只是想了解如何(在最基本的“基本”级别)从用户那里获取输入的信息(用户名、密码、全名),并将其转换为我的数据模型对象,然后将该对象存储到相同类型的对象数组中,最后在配置文件页面上显示数据模型对象。我正在使用它来了解应用程序的一般架构的一部分将是什么样子。

import Foundation
import UIKit

class Account  
    var username: String
    var password: String
    var fullName: String
    
    static var accounts: [Account] = []
    
    init(username: String, password: String, fullName: String) 
        self.username = username
        self.password = password
        self.fullName = fullName
    


我的数据模型文件 Account.swift

import UIKit

class RegisterViewController: UIViewController 
    
    @IBOutlet var usernameField: UITextField!
    @IBOutlet var passwordField: UITextField!
    @IBOutlet var fullNameField: UITextField!
    
    var newAccount = Account(username: "", password: "", fullName: "")
    
    override func viewDidLoad() 
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    
    
    @IBAction func createAccount(_ sender: UIButton) 
        newAccount.username = usernameField.text!
        newAccount.password = passwordField.text!
        newAccount.fullName = fullNameField.text!
        
        Account.accounts.append(newAccount)
    

我的注册视图控制器

import UIKit

class ViewController: RegisterViewController 

    @IBOutlet var usernameLogin: UITextField!
    @IBOutlet var passwordLogin: UITextField!
    
    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    
    
    @IBAction func loginToProfile(_ sender: UIButton) 
        if usernameLogin.text! == newAccount.username 
            print("success")
         else 
            print("error")
        
        
        if passwordLogin.text! == newAccount.password 
            print("success")
         else 
            print("error")
        
    
    
    @IBAction func unwindToLogin(unwindSegue: UIStoryboardSegue)  
        
    



用于登录视图的我的 veiw 控制器。

顶部是创建帐户的视图,底部是登录视图。我现在的问题是通过登录 vc 中的 if 语句,我的控制台输出错误,指示在我尝试注册帐户然后登录后字符串不匹配。

我知道我强制解包了所有 uitextfield 选项,我认为在这种特定情况下影响不大。尽管如此,如果有任何其他明显的问题,请随时指出它们

【问题讨论】:

创建var newAccount = Account(username: "", password: "", fullName: "")这样的帐户有什么意义? 创建一个 Account 实例来存储和重用用户信息。随意完全教我哈哈。它不会让我在不提供一些默认初始化值的情况下创建帐户实例。我想我应该为该类创建一个自定义初始化程序,但如果这会有所作为的话。还没试过。就像我说的那样,这整件事可能是完全错误的。 【参考方案1】:

从外观上看,您有 2 个不同的控制器:RegisterViewController 和另一个 ViewController,尽管它是 RegisterViewController 的子类,但不是同一个实例。所以当你在RegisterViewController里面填newAccount,并不代表你在ViewController里面填newAccount

你应该做的是寻找匹配的帐户Account.accounts,并将其属性与用户提供的属性进行比较,即:

@IBAction func loginToProfile(_ sender: UIButton) 

    // Find the right account
    guard let account = Account.accounts.filter  $0.username == usernameLogin.text!  else 
        print("Error: No such account")
        return
    

    // Now check if passwords match
    guard account.password == passwordLogin.text! else 
        print("Error: incorrect password")
        return
    

注意:这只是让您摆脱困境的最小更改。但实际上,我会做一些其他的改变:

    ViewController 没有理由继承 RegisterViewController - 它们是不同的视图控制器,它们共享信息,但它们的功能用途完全不同。

    我会将Account 设为struct,它代表一个帐户。虽然static var accounts: [Account] = [] 应该在其他某个类中,该类拥有所有帐户,并且将来会从其他地方检索它们。现在最简单的MVC 模式或Accounts 单例就可以了。稍后你可以改进这部分,而struct Account 可能会保持不变。

    第二次更改还允许您更改比较帐户的方式:您可以执行类似的操作(可能有多种变化,仅举一个示例,假设您有一个持有所有帐户的单身人士)

    @IBAction func loginToProfile(_ sender: UIButton) 
    
        Accounts.shared.login(username: usernameLogin.text!, password: passwordLogin.text!)
    

    这将允许您完全抽象如何从您的视图控制器验证用户

【讨论】:

以上是关于在 iOS 应用程序中创建帐户原型时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

通过 terraform 在 aws 中创建 VPC 问题

使用 var 关键字在 Javascript 中创建对象时遇到问题

在 C++ 中创建 GLFW OpenGL 窗口时遇到问题

Azure 门户在存储帐户中创建 Blob 容器时出错

在 C++ 中创建指针向量或指针值映射时遇到问题

使用 mailcore2 在 gmail 帐户中创建标签