2015-10-23 25 views
0

下面是我採取的步驟解析數據刪除 -SWIFT:當UIButton的行動進行

第1步:我在下面的字段中輸入值,他們得到保存在解析表。完美的作品。

enter image description here

第2步:我再次進入這個屏幕,並點擊「提交」再次沒有編輯的字段,並解析錶行被刪除。

我想弄清楚爲什麼會發生這種情況。所需的功能是,當用戶第一次加載此屏幕時,這些字段是空白的。此後,此屏幕加載後,現有值將顯示字段,如果用戶編輯字段並單擊「提交」,則值將有機會。

這是我對這個特殊的視圖控制器代碼 -

import UIKit 
import Parse 

class RSVPViewController: UIViewController { 

/*----------- ~ OUTLETS AND ACTIONS ~ -----------*/ 

//View Controller Title Bar Outlets 
@IBOutlet weak var usernameTitle: UIBarButtonItem! 
@IBOutlet weak var menuTitle: UIBarButtonItem! 

//View Controller Body Outlets 
@IBOutlet weak var label1: UILabel! 
@IBOutlet weak var label2: UILabel! 
@IBOutlet weak var label3: UILabel! 
@IBOutlet weak var label4: UILabel! 

@IBOutlet weak var label1Field: UITextField! 
@IBOutlet weak var label2Field: UITextField! 
@IBOutlet weak var label3Field: UITextField! 
@IBOutlet weak var label4Field: UITextField! 

//View Controller Body Actions 
@IBAction func submitButton(sender: AnyObject) { 

    let query = PFQuery(className:"RSVPData") 
    query.whereKey("username", equalTo: (PFUser.currentUser()?.username)!) 
    query.findObjectsInBackgroundWithBlock { (objects: [PFObject]?, error: NSError?) -> Void in 

     if error == nil { 

      if let objects = objects! as? [PFObject] { 

       for object in objects { 

        object.deleteInBackground() 

       } 
      } 

     } else { 

      print(error) 
     } 
    } 

    let RSVPData = PFObject(className: "RSVPData") 

    RSVPData["label1"] = label1Field.text 
    RSVPData["label2"] = label2Field.text 
    RSVPData["label3"] = label3Field.text 
    RSVPData["label4"] = label4Field.text 
    RSVPData["username"] = PFUser.currentUser()?.username 

    RSVPData.saveInBackgroundWithBlock { 
     (success: Bool, error: NSError?) -> Void in 

     if (success) { 

      if let error = error { 

       if let errorString = error.userInfo["error"] as? String { 

        self.displayAlert("Failed", message: errorString) 

       } 


      } else { 

       self.performSegueWithIdentifier("RSVPToMain", sender: self) 

      } 


     } else { 

      // There was a problem, check error.description 

     } 
    } 


} 

/*----------- ~ MAIN THREAD ~ -----------*/ 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //Run title bar function 
    TitleBar() 

    label1.text = "Label 1" 
    label2.text = "Label 2" 
    label3.text = "Label 3" 
    label4.text = "Label 4" 

    let query = PFQuery(className:"RSVPData") 
    query.whereKey("username", equalTo: (PFUser.currentUser()?.username)!) 
    query.findObjectsInBackgroundWithBlock { (objects: [PFObject]?, error: NSError?) -> Void in 

     if error == nil { 

      if let objects = objects! as? [PFObject] { 

       for object in objects { 

        self.label1Field.text = object["label1"] as? String 
        self.label2Field.text = object["label2"] as? String 
        self.label3Field.text = object["label3"] as? String 
        self.label4Field.text = object["label4"] as? String 

       } 
      } 

     } else { 

      print(error) 
     } 
    } 

} 

/*----------- ~ FUNCTIONS ~ -----------*/ 

//Function containing all title bar instructions 
func TitleBar() { 

    /*----------- ~ NAVIGATION BAR (USER INTERFACE) ~ -----------*/ 

    //Set the navigation bar tet color and size 
    let nav = self.navigationController?.navigationBar 
    nav?.titleTextAttributes = [NSFontAttributeName: UIFont(name: "HelveticaNeue-Light", size: 20)!, NSForegroundColorAttributeName: UIColor(red: 255/255, green: 255/255, blue: 255/255, alpha: 1.0)] 

    /*----------- ~ OUTLET - 'usernameTitle' ~ -----------*/ 

    //Set the 'usernameTitle' font and size 
    usernameTitle.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Arial", size: 11)!], forState: UIControlState.Normal) 

    //Set the 'usernameTitle' outlet to the current user 
    usernameTitle.title = PFUser.currentUser()?.username 

} 

//Function to display an alert 
func displayAlert(title: String, message: String) { 

    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert) 
    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) 
    self.presentViewController(alert, animated: true, completion: nil) 
} 

SOLUTION:

@IBAction func submitButton(sender: AnyObject) { 

    let query = PFQuery(className:"RSVPData") 
    query.whereKey("username", equalTo: (PFUser.currentUser()?.username)!) 
    query.findObjectsInBackgroundWithBlock { (object: [PFObject]?, error: NSError?) -> Void in 

     if error == nil { 

      if object!.count > 0 { 

       if let object = object! as? [PFObject] { 

        for object in object { 

         object["label1"] = self.label1Field.text 
         object["label2"] = self.label2Field.text 
         object["label3"] = self.label3Field.text 
         object["label4"] = self.label4Field.text 

         object.saveInBackground() 

        } 

        self.performSegueWithIdentifier("RSVPToMain", sender: self) 

       } 
      } else if object?.count == 0 { 

       let RSVPData = PFObject(className: "RSVPData") 

       RSVPData["label1"] = self.label1Field.text 
       RSVPData["label2"] = self.label2Field.text 
       RSVPData["label3"] = self.label3Field.text 
       RSVPData["label4"] = self.label4Field.text 
       RSVPData["username"] = PFUser.currentUser()?.username 

       RSVPData.saveInBackgroundWithBlock { 
        (success: Bool, error: NSError?) -> Void in 

        if (success) { 

         if let error = error { 

          if let errorString = error.userInfo["error"] as? String { 

           self.displayAlert("Failed", message: errorString) 

          } 


         } else { 

          self.performSegueWithIdentifier("RSVPToMain", sender: self) 

         } 

        } else { 

         // There was a problem, check error.description 

        } 
       } 



      } 

     } else { 

      print(error) 
     } 
    } 


} 
+0

我不是非常精通swift,但不是你刪除所有對象,你找到任何與object.deleteInBackground()你實際上試圖用這個聲明? – Yan

+0

而不是這些「/ * -----------〜OUTLETS AND ACTIONS〜----------- * /」註釋,你真的應該使用// MARK:出口和動作。 這可以幫助類導航遠遠超過一些詳細評論 – Moriya

+0

@Yan,當提交按鈕被點擊時,我想表中的舊值被替換爲新的。我這樣做的方式是刪除舊行並添加一個新行。你能提出一個更好的方法來完成這個嗎?謝謝! – SB2015

回答

1

如果存在,我不需要刪除該行。您可以使用從用戶那裏獲得的新值更新,而不是刪除該行。以下是parse.com網站關於如何更新現有對象的示例。讓我知道如果你仍然有一個問題,我會嘗試在Xcode和更新你的代碼。 https://parse.com/docs/ios/guide

var query = PFQuery(className:"GameScore") 
query.getObjectInBackgroundWithId("xWMyZEGZ") { 
    (gameScore: PFObject?, error: NSError?) -> Void in 
    if error != nil { 
    print(error) 
    } else if let gameScore = gameScore { 
    gameScore["cheatMode"] = true 
    gameScore["score"] = 1338 
    gameScore.saveInBackground() 
    } 
} 

您可以使用您的代碼並查看下面的評論。

query.whereKey("username", equalTo: (PFUser.currentUser()?.username)!) 
    query.findObjectsInBackgroundWithBlock { (objects: [PFObject]?, error: NSError?) -> Void in 
     if error == nil { 
      if let objects = objects! as? [PFObject] { 
       //see comments bellow 
       //for object in objects { 
        //object.deleteInBackground() 

       // } 
      } 

     } else { 

       print(error) 
     } 
    } 

當你對象的數組,你會檢查是否有數組中只有一個對象,以確保只有一個針對該用戶行,然後做object["sangeet"] = label1Field.text 更新所有字段並做object.saveInBackground();

==========

更新

您可以創建一個新的行對象時返回nil。我想你應該可以藉口保存在findObjectsInBackgroundWithBlock塊內的操作我對swift不是很熟悉,所以我複製粘貼你的代碼,它應該工作。讓我知道你是否仍然有問題。

let query = PFQuery(className:"RSVPData") 
     query.whereKey("username", equalTo: (PFUser.currentUser()?.username)!) 
     query.findObjectsInBackgroundWithBlock { (objects: [PFObject]?, error: NSError?) -> Void in 

      if error == nil { 

       if let objects = objects! as? [PFObject] { 

        for object in objects { 

         object.deleteInBackground() 

        } 
       }else{ 
        //assuming that object is nil and there is no record for that user 
        //you would then add the user and information into the database 

        let RSVPData = PFObject(className: "RSVPData") 

        RSVPData["sangeet"] = label1Field.text 
        RSVPData["tibetan"] = label2Field.text 
        RSVPData["hindu"] = label3Field.text 
        RSVPData["reception"] = label4Field.text 
        RSVPData["username"] = PFUser.currentUser()?.username 

        RSVPData.saveInBackgroundWithBlock { 
         (success: Bool, error: NSError?) -> Void in 

         if (success) { 

          if let error = error { 

           if let errorString = error.userInfo["error"] as? String { 

            self.displayAlert("Failed", message: errorString) 

           } 


          } else { 

           self.performSegueWithIdentifier("RSVPToMain", sender: self) 

          } 


         } else { 

          // There was a problem, check error.description 

         } 
        } 

       } 

      } else { 

       print(error) 
      } 
     } 
+0

這非常有幫助,謝謝。我有一個問題...如果我試圖找到當前用戶的行,我用什麼替換「xWMyZEGZ」? – SB2015

+0

謝謝@Yan。您的解決方案適用於已輸入值的用戶。但是,我仍然面臨的問題是新用戶無法將值添加到表中。你能推薦一個可能的解決方案嗎?謝謝。 – SB2015

+0

@ SB2015我很高興能夠提供幫助。我更新了答案。讓我們知道它是否成功。快樂的編碼! – Yan

0

在我看來,你做刪除行,如果用戶名是相同的值作爲PFUser的用戶名。我之前沒有使用過Parse,但object.deleteInBackground()看起來像是刪除了我。

let query = PFQuery(className:"RSVPData") 
    query.whereKey("username", equalTo: (PFUser.currentUser()?.username)!) 
    query.findObjectsInBackgroundWithBlock { (objects: [PFObject]?, error: NSError?) -> Void in 
     if error == nil { 
      if let objects = objects! as? [PFObject] { 
       for object in objects { 
        object.deleteInBackground() 
       } 
      } 
     } 
    } 

所以我想你只有刪除條目,如果你使用同一個用戶兩次。

+0

每個用戶在解析表中只能有一行。當用戶第一次輸入這些字段中的值時,該行就會被添加。當用戶回到這個視圖控制器時,我希望他們看到每個字段中的現有值,並且如果他們更改這些值並單擊Submit,則現有的表格行會更新。在這一點上,我正在檢查登錄的用戶名是否實際上在表中存在一行,如果他們這樣做,一旦再次單擊提交,它將刪除舊行並添加一個新值(新值S)。你能提出更好的解決方案嗎? – SB2015