我正在尝试将名为LoginViewController的视图控制器中的文本字段(用户名和密码)中的数据传递到一个名为Login的单独swift文件,其中正在进行所有数据处理。 (采用MVC方法)
第一期
我的LoginViewController中的错误:
传递给不带参数的调用的参数
受影响的代码如下所示
class LoginViewController: UIViewController {
@IBOutlet weak var usernameField: UITextField!
@IBOutlet weak var pwdField: UITextField!
@IBAction func loginBtn(sender: AnyObject) {
let loginInstance = Login(userName : self.usernameField.text, password : self.pwdField.text)
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
我的Login.swift文件中的代码
import Foundation
import Alamofire
import SwiftyJSON
class Login {
var userName:String!
var passWord:String!
func logIn(userName : String, password : String) {
let parameters = [
"email": userName, //email
"password": passWord //password
]
var statusCode: Int = 0
Alamofire.request(.POST, "http://anyapi.com/api/v1/auth/login", parameters: parameters, encoding: .JSON)
.responseJSON { response in
statusCode = (response.response?.statusCode)! //Gets HTTP status code, useful for debugging
if let value: AnyObject = response.result.value {
//Handle the results as JSON
let post = JSON(value)
if let key = post["session_id"].string {
//At this point the user should have authenticated, store the session id and use it as you wish
} else {
print("error detected")
}
}
}
}
}
如何最好地解决问题?
另外,如果可能的话,我想将api令牌存储在带有域的ios设备上。有没有好的教程或指南呢?
提前谢谢
答案 0 :(得分:2)
这可能是一个警告,而不是错误。这意味着您正在创建从未使用过的新变量:
var inputUsername = usernameField.text
var inputPassword = pwdField.text
如果不在任何地方使用它们,可以安全地将它们移除。
您正在将UIViewController
投射到不相关的类型Login
。检查您的Login
类是否继承自UIViewController
,并且它是在Storyboard中声明的正确目标。更合适的名称是LoginViewController
。
if let destination = segue.destinationViewController as? LoginViewController
Alamofire需要一个[String: AnyObject?]
字典,而你传递的是[String: String?]
字典。这可以通过在创建时修复推断的字典类型来轻松解决:
let parameters: [String: AnyObject?] = [
"email": userName, //email
"password": passWord //password
]
你完全改变了你的问题,所以这个答案现在有点无用了。我将在下面回答您的新问题:
此方法不存在,并且导致您的错误:
let loginInstance = Login(userName : self.usernameField.text, password : self.pwdField.text)
您应该将其更改为更像这样:
let loginModel = Login()
@IBAction func loginBtn(sender: AnyObject) {
loginModel.logIn(self.usernameField.text, self.pwdField.text)
}
答案 1 :(得分:2)
以下是我发现的一些观察结果,
从未使用变量'inputUsername'的初始化
var inputUsername = usernameField.text
var inputPassword = pwdField.text
变量inputUsername和inputPassword正在loginBtn的IBAction中声明和初始化,这意味着一旦控件退出此函数,两个变量都将失去它们的值。因此编译器希望您在控件离开功能块之前以某种有意义的方式使用它。但是因为你在函数loginBtn中没有任何其他语句而且变量从未被使用因此警告:)
编译器告诉您,您尚未使用已初始化的变量。
解决方案: 1 GT;您不需要这些变量,因为您直接从prepareForSegue中的文本字段引用传递值:)
2 - ;在类范围而不是在函数范围内声明变量,然后在IBAction中初始化它并在需要时使用它
var inputUsername : String!
var inputPassword : String!
无法将[String:String?]类型的值转换为[String:AnyObject?]
类型的预期参数您可以使用以下内容:)
let parameters: [String: AnyObject?] = [
"email": userName, //email
"password": passWord //password
]
从'UIViewController'转换为不相关的类型'Login'始终失败
登录ViewController伙伴?如果是,请将此添加到登录声明:)
class Login : UIViewController {
修改强>
我认为在你的情况下,Login不是一个viewController而是它只是一个处理数据用户名和密码的模型类:)
如果是这样的话:你不能为那个伙伴使用segues,segues就是要处理UIViewControllers而不是简单地加载普通类。
以下是你可以做的事情:)
您可以按照以下方式更改登录初始化:)
init(userName : String, password : String) {
let parameters: [String: AnyObject?] = [
"email": userName, //email
"password": passWord //password
]
var statusCode: Int = 0
Alamofire.request(.POST, "http://anyapi.com/api/v1/auth/login", parameters: parameters, encoding: .JSON)
.responseJSON { response in
statusCode = (response.response?.statusCode)! //Gets HTTP status code, useful for debugging
if let value: AnyObject = response.result.value {
//Handle the results as JSON
let post = JSON(value)
if let key = post["session_id"].string {
//At this point the user should have authenticated, store the session id and use it as you wish
} else {
print("error detected")
}
}
}
}
最后你可以在loginBtn的IBAction中调用login:)
let loginInstance = Login(userName : self.usernameField.text!, password : self.pwdField.text!)
如果您已声明任何segue导航到Login类,请在执行前删除它:)
希望我的回答有所帮助:)