在 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 应用程序中创建帐户原型时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章