2016-04-13 4 views
0

Я пытаюсь заполнить tableView с помощью словаря синтаксического анализа (содержащего строку и местоположение), я могу загрузить данные для разбора и загрузки на консоль, однако у меня возникли проблемы с добавлением его к моему Tableview, место добавляется как это (в виде карты):Как я могу заполнить tableView с помощью словаря синтаксического анализа?

let geoPoint = PFObject(className: "location") 

geoPoint["location"] = activePlace 
geoPoint["spot"] = places 
geoPoint.saveInBackgroundWithBlock { (succes, error) -> Void in 
    print("place has been saved") 
} 

и он dowloaded/добавляется к консоли, как это:

let query = PFQuery(className: "location") 
query.findObjectsInBackgroundWithBlock { (object, error) in 


    if error != nil { 

     print(error) 

    }else { 

     print(object) 
     self.tableView.reloadData() 

    } 
} 

полный код моего Tableview является следующее:

import UIKit 
import Parse 

var rideSpots = [""] 

//test start 

//class Place { 
// var ACL : String 
// var location : String 

// init(ACL : String, location : String) { 
//  self.ACL = ACL 
//  self.location = location 
// } 
//} 
//let places2 : [Place] = [] 
//test stop 

var places = [Dictionary<String,String>()] 

var activePlace = -1 

class TableViewController: UITableViewController { 

    @available(iOS 8.0, *) 
    func companyNameUpdatedAlert(title: String, error: String, indexPath: Int) { 

     let alert = UIAlertController(title: title, message: error, preferredStyle: UIAlertControllerStyle.Alert) 

     alert.addTextFieldWithConfigurationHandler { (textField) -> Void in 

      textField.placeholder = "Enter new text" 

     } 

     alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { (action) -> Void in 

      let lat = places[indexPath]["lat"]! 

      let lon = places[indexPath]["lon"]! 

      places.removeAtIndex(indexPath) 

      places.insert(["name" : alert.textFields![0].text!, "lat" : lat, "lon" : lon], atIndex: indexPath) 

      self.tableView.reloadData() 

      NSUserDefaults.standardUserDefaults().setObject(places, forKey: "places") 
      NSUserDefaults.standardUserDefaults().synchronize() 


     })) 

     self.presentViewController(alert, animated: true, completion: nil) 


    } 

    @available(iOS 8.0, *) 
    override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? { 

     let changeText = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Change spot name" , handler: { (action:UITableViewRowAction, indexPath:NSIndexPath) -> Void in 

      self.companyNameUpdatedAlert("Update text", error: "enter text below", indexPath: indexPath.row) 

     }) 
    /* 
     let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete" , handler: { (action:UITableViewRowAction, indexPath:NSIndexPath) -> Void in 

      places.removeAtIndex(indexPath.row) 

      tableView.reloadData() 

      NSUserDefaults.standardUserDefaults().setObject(places, forKey: "places") 
      NSUserDefaults.standardUserDefaults().synchronize() 

     }) 
     */ 
     return [changeText] 


    } 

    override func viewDidLoad() { 



      super.viewDidLoad() 

     //retreve the data from parse start 

     let query = PFQuery(className: "location") 
     query.findObjectsInBackgroundWithBlock { (object, error) in 


      if error != nil { 

       print(error) 

      }else { 

       print(object) 
       self.tableView.reloadData() 

      } 
     } 


       //retreve the data from parse stop 


      if places.count == 1 { 

       places.removeAtIndex(0) 

       places.append(["name":"GO to map to add spot","lat":"90","lon":"90"]) 




      } 
      if NSUserDefaults.standardUserDefaults().objectForKey("places") != nil { 

       places = NSUserDefaults.standardUserDefaults().objectForKey("places") as! [Dictionary] 


      } 

     } 


    override func didReceiveMemoryWarning() { 

     didReceiveMemoryWarning() 

    } 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 

     return 1 

    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return places.count 
     //return places2.count 


    } 

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

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

     cell.textLabel?.text = places[indexPath.row]["name"] 
     //cell.textLabel!.text = places2[indexPath.row].location 


     return cell 



    } 

    override func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { 

     activePlace = indexPath.row 

     return indexPath 

    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

     if segue.identifier == "newPlace" { 

      activePlace = -1 


     } 

    } 

    override func viewWillAppear(animated: Bool) { 

    tableView.reloadData() 


    } 

} 

Это звучит просто, но по какой-то причине я не могу понять это, поэтому любая помощь будет высоко оценена.

Спасибо!

+0

Необходимо сохранить места, которые вы получаете от API. Где вы говорите 'print (object)', вы пытались добавить 'places = object' (перед вызовом reloadData!) – Bensge

+0

Когда я это делаю, он говорит мне:« Невозможно присвоить значение типа ['PFObject]?' чтобы напечатать ['Dictionary ]' @Bensge –

ответ

0

Поскольку вы пытаетесь создать объект, представляющий меньшие части большего PFObject, я бы порекомендовал вам создать места STRUCT

struct Places { 
    var someData: String! 
    var someMoreData: String! 
} 

//Class level variable of places 
var places: [Places]? 

Затем, когда вы получите ваш объект из вашего запроса, вы можете создайте свое место и добавьте его в массив.

var placeToAdd = Places(someData: object["name"], someMoreData: object["anotherField"]) 
places.append(placeToAdd) 

И наконец, при создании своей ячейки вы можете получить доступ к информации соответствующим образом.

cell.textLabel!.text = places[indexPath.row].name 
+0

Я пробовал это, но это дает мне много ошибок. –

+0

Эта идея работает. Пример, который я дал, был именно таким примером. Он должен был продемонстрировать, как вы можете реализовать что-то подобное в своем проекте, не предназначенное для копирования и вставки, а также для решения. – pbush25

Смежные вопросы