我将 Swift 与 SQLite.swift 结合使用.我有以下 UIViewController:
class LoginViewController: UIViewController {
@IBOutlet weak var emailField: UITextField!
func setEmailAddress(email:String){
emailField.text = email
}
override func viewDidLoad() {
MySQLite().updateLatestEmailAddressFromUserTable() // breaks here (email is in console, though...)
}
}
然后我尝试从另一个类更新它的值(通过 setEmailAddress 函数):
class MySQLite {
func updateLatestEmailAddressFromUserTable(){
let dbPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as String
let db = Database("\(dbPath)/db.sqlite3")
let users = db["users"]
let id = Expression<Int>("id")
let email = Expression<String>("email")
let time = Expression<Int>("time")
for user in users.limit(1).order(time.desc) {
println(user[email]) // this works, correctly outputs in console: email@domain.com
LoginViewController().setEmailAddress(user[email]) // breaks here
}
}
}
上面的代码给我以下错误
fatal error: unexpectedly found nil while unwrapping an Optional value
进一步解释一下:我正在检索 SQLite 表中的最新条目以获取用户的电子邮件地址并更新登录 View Controller 中的文本字段。这样可以让返回的用户更轻松地登录。
我已经为此苦苦挣扎了 2 个多小时,并尝试了各种方法。我认为主要问题是,当我尝试从我的第二个函数简单地将电子邮件地址作为字符串返回并直接从 LoginViewController 设置该字段时,它不起作用(SQLite 相关代码未“执行” “但我相信)。
可能相关的线程(Obj-C): set UITextField.text from another class
请您参考如下方法:
这里发生了什么 LoginViewController().setEmailAddress(user[email]) 创建了 LoginViewController 的新实例,它与您当前的 LoginViewController 不同。
为什么不在 MySQLite 中制定协议(protocol)并定义为委托(delegate)
LoginViewController 将实现更新方法。将委托(delegate)传递给 MySqlite
在 MySQLite 中,当您从数据库中获取值时调用委托(delegate)更新方法。
例子
MySQLite
protocol loginDelegate
{
func update(NSString)
}
class MySQLite {
var delegate:loginDelegate?
func updateLatestEmailAddressFromUserTable(){
let dbPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as String
let db = Database("\(dbPath)/db.sqlite3")
let users = db["users"]
let id = Expression<Int>("id")
let email = Expression<String>("email")
let time = Expression<Int>("time")
for user in users.limit(1).order(time.desc) {
println(user[email]) // this works, correctly outputs in console: email@domain.com
if((delegate) != nil)
{
delegate?.update("example@example.com")
}
}
}
}
class LoginViewController: UIViewController,loginDelegate {
@IBOutlet weak var emailField: UITextField!
func setEmailAddress(email:String){
emailField.text = email
}
override func viewDidLoad() {
var mySQLite: MySQLite=LoginClass();
mySQLite.delegate=self;
[mySQLite .updateLatestEmailAddressFromUserTable()];
}
func update(email: NSString) {
println(email);
emailField.text = email
}
}
