实验一个名为sweeter的类似Twitter的应用程序的教程。一切都很好,但登录和注册闭包不接受我的论点:
错误消息:
无法使用类型'(String!,password:String!,(PFUser!,NSError!) - > Void)'
的参数列表调用'logInWithUsernameInBackground'提前致谢
import UIKit
import Parse
class TimelineTableViewController: UITableViewController {
// MARK: Parse
override func viewDidAppear(animated: Bool) {
if PFUser.currentUser() == nil {
var loginAlertController = UIAlertController(title: "Sign up / login", message: "please sign up or login", preferredStyle: UIAlertControllerStyle.Alert)
loginAlertController.addTextFieldWithConfigurationHandler({
textfField in
textfField.placeholder = "Your username"
})
loginAlertController.addTextFieldWithConfigurationHandler({
textfField in
textfField.placeholder = "Your password"
textfField.secureTextEntry = true
})
// MARK: login action in the array
loginAlertController.addAction(UIAlertAction(title: "Login Action", style: UIAlertActionStyle.Default, handler: {
alertAction in
let textFields : NSArray = loginAlertController.textFields!
let usernameTextField : UITextField = textFields[0] as! UITextField
let passwordTextField : UITextField = textFields[1] as! UITextField
//MARK: Parse login problem - 15:39
PFUser.logInWithUsernameInBackground(usernameTextField.text, password: passwordTextField.text){
(user: PFUser?, error: NSError?) -> Void in
if (PFUser) {
println("login success!")
} else {
println()("login failed!")
}
}
}))
// MARK: sign up action in the array
loginAlertController.addAction(UIAlertAction(title: "Sign up", style: UIAlertActionStyle.Default, handler: {
alertAction in
let textFields : NSArray = loginAlertController.textFields!
let usernameTextField : UITextField = textFields[0] as! UITextField
let passwordTextField : UITextField = textFields[1] as! UITextField
var sweeter = PFUser() //16:42
sweeter.username = usernameTextField.text
sweeter.password = passwordTextField.text
sweeter.signUpInBackgroundWithBlock({
(success: Bool, error: NSError?) -> Void in
if error == nil {
println("sign up successful")
} else {
let errorString = error!.userInfo["error"] as! String
println(errorString)
}
})
}))
self.presentViewController(loginAlertController, animated: true, completion: nil)
}
}
编辑2.0:
import UIKit
import Parse
class TimelineTableViewController: UITableViewController {
var timeLineData : [String] = []
func loadData() {
timeLineData.removeAll(keepCapacity: true)
var findTimelineData = PFQuery(className: "Sweeters")
findTimelineData.findObjectsInBackgroundWithBlock({
(objects : [AnyObject]?, error : NSError?) -> Void in
if error == nil {
for object in objects! {
self.timeLineData.append(object as! String)
}
let array : Array = self.timeLineData.reverse()
self.timeLineData = array as Array
self.tableView.reloadData()
}
})
}
// MARK: Parse
override func viewDidAppear(animated: Bool) {
if PFUser.currentUser() == nil {
var loginAlertController = UIAlertController(title: "Sign up / login", message: "please sign up or login", preferredStyle: UIAlertControllerStyle.Alert)
loginAlertController.addTextFieldWithConfigurationHandler({
textfField in
textfField.placeholder = "Your username"
})
loginAlertController.addTextFieldWithConfigurationHandler({
textfField in
textfField.placeholder = "Your password"
textfField.secureTextEntry = true
})
// MARK: login action in the array
loginAlertController.addAction(UIAlertAction(title: "Login Action", style: UIAlertActionStyle.Default, handler: {
alertAction in
let textFields : NSArray = loginAlertController.textFields!
let usernameTextField : UITextField = textFields[0] as! UITextField
let passwordTextField : UITextField = textFields[1] as! UITextField
//MARK: Parse login problem - 15:39
PFUser.logInWithUsernameInBackground(usernameTextField.text, password: passwordTextField.text){
(user: PFUser?, error: NSError?) -> Void in
if user != nil {
println("login success!")
} else {
println("login failed!")
}
}
}))
// MARK: sign up action in the array
loginAlertController.addAction(UIAlertAction(title: "Sign up", style: UIAlertActionStyle.Default, handler: {
alertAction in
let textFields : NSArray = loginAlertController.textFields!
let usernameTextField : UITextField = textFields[0] as! UITextField
let passwordTextField : UITextField = textFields[1] as! UITextField
var sweeter = PFUser() //16:42
sweeter.username = usernameTextField.text
sweeter.password = passwordTextField.text
sweeter.signUpInBackgroundWithBlock({
(success: Bool, error: NSError?) -> Void in
if error == nil {
println("sign up successful")
} else {
// let errorString = error!.userInfo["error"] as! String
let errorString = error!.localizedDescription
println(errorString)
}
})
}))
self.presentViewController(loginAlertController, animated: true, completion: nil)
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Potentially incomplete method implementation.
// Return the number of sections.
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete method implementation.
// Return the number of rows in the section.
return timeLineData.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cellReuseID", forIndexPath: indexPath) as! UITableViewCell
// Configure the cell...
return cell
}
截图
编辑3.0 错误消息“字符串不能转换为PFObject”
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cellReuseID", forIndexPath: indexPath) as! SweetTableViewCell
// Configure the cell...
let sweet : PFObject = self.timeLineData[indexPath.row] as PFObject
cell.sweetTextView.text = sweet.objectForKey("content") as! String
return cell
}
答案 0 :(得分:1)
PFUser.logInWithUsernameInBackground("myname", password:"mypass") {
(user: PFUser?, error: NSError?) -> Void in
if user != nil {
// Do stuff after successful login.
} else {
// The login failed. Check error to see why.
}
}
在您使用的块中if(PFUser){}它应该是用户{...}
答案 1 :(得分:1)
var timeLineData : [String] = []
func loadData() {
timeLineData.removeAll(keepCapacity: false)
var findTimelineData = PFQuery(className: "Sweeters")
findTimelineData.findObjectsInBackgroundWithBlock({
(objects : [AnyObject]?, error : NSError?) -> Void in
if error == nil {
// The find succeeded.
println("Successfully retrieved \(objects!.count) objects.")
// Do something with the found objects
if let objects = objects as? [PFObject] {
for object in objects {
self.timeLineData.append(object as! String)
}
}
} else {
// Log details of the failure
println("Error: \(error!) \(error!.userInfo!)")
}
})
self.tableview.reloadData()
}
答案 2 :(得分:0)
我猜您应该将PFUser!
和NSError!
替换为PFUser?
和NSError?
而且,仔细看看这个闭包:
sweeter.signUpInBackgroundWithBlock({
(success: Bool(), error: NSError()) -> Void in
if error == nil {
println("sign up successful")
} else {
let errorString = error.userInfo["error"] as String
println(errorString)
}
})
我想闭包参数应为(success: Bool, error: NSError?) -> Void
修改强> 第一个错误是因为你不能在Swift中做到这一点
if (PFUser) {
应为user != nil
此行有额外()对println()("login failed!")
通过替换
修复了第二个错误let errorString = error.userInfo["error"] as String
使用let errorString = error!.localizedDescription