2016-01-06 4 views
2

Я работаю над проектом прямо сейчас, и я использую SwiftyJSON для анализа json с моего сервера, сначала он загружается отлично, но когда я его перезагружаю, он, похоже, не работает пока я не перезапущу приложение, вот тот метод, который я использовал:SwiftyJSON не перезагружает UITableView

override func viewDidLoad() { 
     super.viewDidLoad() 
     connectToServer() 
     self.refreshControls.addTarget(self, action: "connectToServer", forControlEvents: .ValueChanged) 
     self.tableView.addSubview(self.refreshControls) 
    } 

    func connectToServer() { 
     let urlString = "http://myserver.com/" 

     if let url = NSURL(string: urlString) { 
      if let data = try? NSData(contentsOfURL: url, options: []) { 

       let json = JSON(data: data) 
       self.parseJSON(json) 

      } 
     } 


    } 


    func parseJSON(json: JSON) { 
     numberOfRows = json.count 
     for i in 0...numberOfRows { 


      let name = json[i]["name"].stringValue 
      let age = json[i]["age"].stringValue 
      let g = json[i]["gender"].stringValue 
      let b = json[i]["bday"].stringValue 


      names.append(name) 
      ages.append(age) 
      genders.append(g) 
      bdays.append(b) 
     } 


     tableView.reloadData() 
     self.refreshControls.endRefreshing() 

    } 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return numberOfRows 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     var cell = tableView.dequeueReusableCellWithIdentifier("cell") as! MainCell! 
     if cell == nil { 
      cell = MainCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell") 
     } 

      cell.nameLbl.text = names[indexPath.row] 
      cell.ageLbl.text = ages[indexPath.row] 
      cell.genderLbl.text = genders[indexPath.row] 
      cell.bdayLbl.text = bdays[indexPath.row] 



     return cell 
    } 

Я что-то пропустил? Благодаря!

+0

Можете ли вы поделиться определение класса и decalaration переменных (Tableview и т.д.) тоже. Также, если вызывается tableView.reloadData()? –

+0

Вы проверили, что вы нажали 'tableView.reladData()' и обновлен ли 'numberOfRows'? OT вы должны сделать модель и создать объект вместо четырех разных массивов. –

+1

где вы очистили массив данных, например имена, возрасты ...? Вы просто добавили его, а numberOfRows заменили на Json.count, поэтому новые добавленные данные могут не отображаться – SolaWing

ответ

3

Предложение по улучшению рабочего процесса.

Создать собственный класс

class Person { 

    let name : String 
    let age : String 
    let gender : String 
    let birthday : String 

    init(name: String, age : String, gender: String, birthday : String) 
    { 
    self.name = name 
    self.age = age 
    self.gender = gender 
    self.birthday = birthday 
    } 
} 

В контроллере представления объявить переменную people

var people = [Person]() 

Изменить parseJSON этому коду для создания Person экземпляров

func parseJSON(json: JSON) { 
    people.removeAll() 
    for i in 0..<json.count { 
    let item = json[i] 
    let person = Person(name: item["name"].stringValue, 
     age: item["age"].stringValue, 
     gender: item["gender"].stringValue, 
     birthday: item["bday"].stringValue) 
    people.append(person) 
    } 

    tableView.reloadData() 
    self.refreshControls.endRefreshing() 
} 

Затем возвращают номер лиц в numberOfRowsInSection

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

и обновление пользовательского интерфейса с

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier("cell") as! MainCell 
    if cell == nil { 
    cell = MainCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell") 
    } 
    let person = people[indexPath.row] 
    cell.nameLbl.text = person.name 
    cell.ageLbl.text = person.age 
    cell.genderLbl.text = person.gender 
    cell.bdayLbl.text = person.birthday 
    return cell 
} 
0

Я только что понял. Я просто очистил все сущности, как говорит вадзи. Пример:

func connectToServer() { 

     names.removeAll() 
     ages.removeAll() 
     genders.removeAll() 
     bdays.removeAll() 

     let urlString = "http://myserver.com/" 

     if let url = NSURL(string: urlString) { 
      if let data = try? NSData(contentsOfURL: url, options: []) { 

       let json = JSON(data: data) 
       self.parseJSON(json) 

      } 
     } 


    } 

Спасибо за все ваши комментарии!

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