2016-06-27 154 views
1

處理將數據存儲在Firebase上並將數據加載到我的TableView中的應用程序。必須從我找到的教程中稍微更改(舊)代碼,以便我希望有人能夠發現我犯的錯誤。用戶可以添加一個事件:名稱,日期,描述(所有字符串)和圖像。這些數據被載入到三個「標籤」和圖像頂部。爲什麼我的代碼不工作? - setObjectForKey:key不能爲零

import UIKit 
import Firebase 
import FirebaseDatabaseUI 

class EventViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    //outlets for text & image 
    @IBOutlet weak var photoImageView: UIImageView! 

    @IBOutlet weak var eventName: UITextField! 
    @IBOutlet weak var eventDate: UITextField! 
    @IBOutlet weak var eventDes: UITextView! 

    //Database connection 
    let rootref = FIRDatabase().reference() 
    var imagePicker: UIImagePickerController = UIImagePickerController() 



    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    @IBAction func submitEvent(sender: AnyObject) { 

     let name = eventName.text 
     let date = eventDate.text 
     let text = eventDes.text 
     var data: NSData = NSData() 

     if let image = photoImageView.image { 
      data = UIImageJPEGRepresentation(image,0.1)! 
     } 

     let base64String = data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength) 

     let user: NSDictionary = ["name":name!, "date":date!, "text":text!, "photoBase64":base64String] 

     //Add firebase child node 
     let event = FIRDatabase().reference().child(name!) 

     // Write data to Firebase 
     event.setValue(user) 

     navigationController?.popViewControllerAnimated(true) 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     view.endEditing(true) 
     super.touchesBegan(touches, withEvent: event) 
    } 

    //UIImagePickerControllerDelegate methods 

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
     imagePicker.dismissViewControllerAnimated(true, completion: nil) 
     photoImageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage 
    } 

    func imagePickerControllerDidCancel(picker: UIImagePickerController) { 
     dismissViewControllerAnimated(true, completion: nil) 
    } 

    @IBAction func addPicture(sender: AnyObject) { 
     if(UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)) { 
      imagePicker = UIImagePickerController() 
      imagePicker.delegate = self 
      imagePicker.sourceType = .Camera 

      presentViewController(imagePicker, animated: true, completion: nil) 
     } else { 
      imagePicker.allowsEditing = false 
      imagePicker.sourceType = .PhotoLibrary 
      imagePicker.delegate = self 
      presentViewController(imagePicker, animated: true, completion:nil) 
     } 
    } 
} 

我TABLEVIEWCONTROLLER

import UIKit 
import Firebase 

class EventTableViewController: UITableViewController { 

    @IBOutlet weak var eventImage: UIImageView! 
    @IBOutlet weak var eventName: UILabel! 
    @IBOutlet weak var eventDate: UILabel! 
    @IBOutlet weak var eventText: UITextView! 

    let rootref = FIRDatabase().reference() 
    var items = [NSDictionary]() 


    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     items = [NSDictionary]() 

     FIRDatabase.load() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    //TableView Data 
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return items.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 

     configureCell(cell, indexPath: indexPath) 

     return cell 
    } 

    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 
     if editingStyle == .Delete { 

      let dict = items[indexPath.row] 
      let name = dict["name"] as! String 

      // delete data from firebase 

      let event = FIRDatabase().reference().child(name) 
      event.removeValue() 
     } 
    } 

    // MARK:- Configure Cell 

    func configureCell(cell: UITableViewCell, indexPath: NSIndexPath) { 
     let dict = items[indexPath.row] 

     eventName.text = dict["name"] as? String 
     eventDate.text = dict["name"] as? String 
     eventText.text = dict["name"] as? String 

     let base64String = dict["photoBase64"] as! String 
     populateImage(cell, imageString: base64String) 
    } 

    func populateImage(cell:UITableViewCell, imageString: String) { 

     let decodedData = NSData(base64EncodedString: imageString, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) 

     let decodedImage = UIImage(data: decodedData!) 

     cell.imageView!.image = decodedImage 
    } 

    //load data from Firebase 
    func loadDataFromFirebase() { 

     UIApplication.sharedApplication().networkActivityIndicatorVisible = true 


      rootref.observeEventType(.Value, withBlock: { snapshot in 
       var tempItems = [NSDictionary]() 


      for item in snapshot.children { 
       let child = item as! FIRDataSnapshot 
       let dict = child.value as! NSDictionary 
       tempItems.append(dict) 
      } 

      self.items = tempItems 
      self.tableView.reloadData() 
      UIApplication.sharedApplication().networkActivityIndicatorVisible = false 

     }) 
    } 
} 

IMAGE讓我的工作

My app so far

回答

2

看這句話的想法:

let user: NSDictionary = ["name":name!, "date":date!, "text":text!, "photoBase64":base64String] 

你是在這裏做了很多的強制解包。事實上,你在很多地方都做了很多的強制解包。當你這樣做時,你會說:「我百分之百確定這裏總是有價值的」。避免這幾乎所有的成本。該行應該看起來像這樣。

if let unwrappedName = name , unwrappedDate = date, unwrappedText = text{ 
    let user: NSDictionary = ["name":unwrappedName, "date":unwrappedDate, "text":unwrappedText, "photoBase64":base64String] 
} 

像這樣展開選項會讓您的應用程序崩潰。你應該在這裏放置一個斷點來看看什麼值是零。每次你使用!你應該仔細考慮它。

+0

這個。現在人們編寫代碼就好像'!'會在需要時奇蹟般地創建有效值! –

+1

開始Swift程序員應該假裝強制 - 解包操作符不存在。在D&D術語中,在武器解鎖之前,您必須獲得一定數量的經驗值。 :) –

+0

所以這裏最好的建議是刪除我所有的武力解開?但它一直給我一個錯誤,如果我刪除「!」...對不起,因爲在這裏的菜鳥它已經像一個星期已經試圖將這個應用程序連接到firebase :( 將在幾個小時內回家再次測試生病讓你更新.. – Orangez

0

我相信這個錯誤是你設置數據庫連接的地方。

您有:let rootref = FIRDatabase().reference()

它應該是:let rootref = FIRDatabase().database().reference()

我得到了同樣的錯誤,這個固定爲我。

相關問題