Swift - Parse.com - 为什么这个闭包是错的?

时间:2015-07-15 15:31:04

标签: ios swift login parse-platform closures

实验一个名为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
    }

截图 enter image description here

编辑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
    }

3 个答案:

答案 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