2015-01-22 3 views
0

Я новичок в IOS и быстро. Я пытаюсь реализовать запрос api get, который возвращает json, а затем отображает его в таблице. Ниже мой текущий код. Когда я бег имитатора я получаю следующее сообщение об ошибке:IOS/Swift таблица рендеринга после запроса JSON

фатальной ошибка: Не удаюсь индексом пустого буфера

Если удалить жёстко прописанное возвращение 3 в функции Tableview и вместо того, чтобы не использовать doDatItems.count ничего делает в таблице, потому что я догадайтесь, что массив doDatItems пуст до запроса запроса. Кажется, что это время? Как обеспечить, чтобы запрос запроса был выполнен до загрузки таблицы?

import UIKit 

class ViewController: UIViewController, UITableViewDelegate { 

    var doDatItems:[String] = [] 

    @IBOutlet weak var doDatItem: UITextField! 

    @IBOutlet weak var yourDoDats: UILabel! 

    @IBAction func addDoDat(sender: AnyObject) { 

     doDatItems.append(doDatItem.text) 

     println(doDatItems) 
    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     let urlPath = "http://localhost:3000/dodats" 
     let url: NSURL = NSURL(string: urlPath)! 
     let session = NSURLSession.sharedSession() 

     let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in 
      println("Task completed") 
      if((error) != nil) { 
       // If there is an error in the web request, print it to the console 
       println(error.localizedDescription) 
      } 
      var err: NSError? 
      var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary 
      if(err != nil) { 
       // If there is an error parsing JSON, print it to the console 
       println("JSON Error \(err!.localizedDescription)") 
      } else { 
       let dataArray = jsonResult["dodats"] as [String] 

       for item in dataArray { 
        self.doDatItems.append(item) 
       } 

//    println(self.doDatItems) 

      } 

     }) 

     task.resume() 
    } 

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

     return 3 

    } 

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

     let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell") 

     println(self.doDatItems) 

     cell.textLabel?.text = self.doDatItems[indexPath.row] 

     return cell 
    } 


    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 

ответ

1

Я нашел несколько проблем -

  1. Вы ViewController должны соответствовать UITableViewDataSource (который отсутствует, не знаю, как он пошел так далеко)

  2. Не возвращайте 3, когда самостоятельно. doDatItems не содержит никаких элементов. Это приведет к сбою. Пока данные загружаются, таблица остается пустой. return self.doDatItems.count

  3. Как только данные будут загружены и готовы к отображению из массива self.doDatItems, просто вызовите метод reloadData() вашего представления таблицы.

  4. Перед этим у вас должна быть ссылка (или IBOutlet) вашего TableView, чтобы вы могли вызывать reloadData() из любого места.

0

В этом методе делегата, который возвращает количество строк,

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

Не используйте статический номер как 3. Получите ваш массив Count & Верните подсчет здесь.

После ответа json, перезагрузите tableView. В объективе-c это делается с помощью

[tableView reloadData]; 
1

Вам необходимо активировать обновление страницы после получения и анализа данных.

Что-то вдоль линий

self.tableView.reloadData()

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