2015-05-20 4 views
0

Я просмотрел множество учебников и сообщений на эту тему, но я не могу получить разрешение на работу над моим проектом. По сути, я пытаюсь реализовать «pull to refresh» в моем TableView на iOS, который затем перезагружает некоторые данные через веб-сервер, а затем перезагружает таблицу с последним набором данных.Сложность Перезагрузка TableView In Swift

От тестирования кажется, что работает мое «pull to refresh», в котором я успешно могу извлечь последние данные из моего запроса веб-сервисов. Однако, как представляется, происходит сбой, поскольку ячейки таблицы фактически не обновляются с использованием последних данных. Вот что у меня в моем TableViewController;

import UIKit 

class MinionsTableViewController: UITableViewController { 
let minions: [Minion] 
required init(coder aDecoder: NSCoder!) { 
    minions = Minion.fetchMinionData() 
    super.init(coder: aDecoder) 
} 

override func viewDidLoad() { 

    super.viewDidLoad() 
    let defaults = NSUserDefaults(suiteName: "group.com.example.myapp.data") 
    NSKeyedArchiver.setClassName("Minion", forClass: Minion.self) 
    defaults?.setObject(NSKeyedArchiver.archivedDataWithRootObject(minions), forKey: "minions") 

    self.refreshControl?.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged) 
} 

func handleRefresh(refreshControl: UIRefreshControl) { 
    let minions: [Minion] 
    minions = Minion.fetchMinionData() 
    for minion in minions { 
     println(minion.now!) 
    } 
    self.tableView.reloadData() 
    refreshControl.endRefreshing() 
} 

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

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("minionCell", forIndexPath: indexPath) as! UITableViewCell 

    let minion = minions[indexPath.row] 

    if let name = minion.name { 
     cell.imageView?.image = UIImage(named: minion.name!) 
     cell.textLabel?.text = minion.name ?? "Minion" 
     cell.detailTextLabel?.text = "Data: \(minion.now!)" 
    } else { 
     cell.imageView?.image = UIImage(named: "Dave") 
     cell.textLabel?.text = "No data available." 
     cell.detailTextLabel?.text = "Sorry, nothing to present here!" 
    } 

    return cell 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "ShowDetail" { 
     let indexPath = self.tableView.indexPathForSelectedRow() 
     //println(indexPath) 
     let minionDetail = minions[indexPath!.row] 
     let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailedViewController 
     controller.detailItem = minionDetail 
    } 
} 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    if let selectedIndexPath = self.tableView.indexPathForSelectedRow() { 
     self.tableView.deselectRowAtIndexPath(selectedIndexPath, animated: true) 

    } 
} 
} 

My "minion.now!" переменная - это некоторые данные JSON с текущей меткой времени, и из моего вывода println я вижу, что она фактически обновляется, когда я пытаюсь обновить. Тем не менее, ячейки моей таблицы, похоже, не обновляются при каждом нажатии.

Любые мысли будут оценены наиболее высоко. Спасибо!

+0

пусть это для констант используйте переменную var в переменной ячейки. –

ответ

0

В этом методе ниже вы создаете локальную переменную, которая не имеет никакого отношения к вашему свойству класса.

func handleRefresh(refreshControl: UIRefreshControl) { 
    let minions: [Minion]//Delete this line 
    minions = Minion.fetchMinionData() //self.minions = Minion.fetchMinionData() 
    for minion in minions { 
     println(minion.now!) 
    } 
    self.tableView.reloadData() 
    refreshControl.endRefreshing() 
} 

Так преобразовать строку в

self.minions = Minion.fetchMinionData() 

и имущество вы объявили на уровне класса делают его как

var minions: [Minion] 

Полный код ..

import UIKit 

class MinionsTableViewController: UITableViewController { 
var minions: [Minion] 
required init(coder aDecoder: NSCoder!) { 
    minions = Minion.fetchMinionData() 
    super.init(coder: aDecoder) 
} 

override func viewDidLoad() { 

    super.viewDidLoad() 
    let defaults = NSUserDefaults(suiteName: "group.com.example.myapp.data") 
    NSKeyedArchiver.setClassName("Minion", forClass: Minion.self) 
    defaults?.setObject(NSKeyedArchiver.archivedDataWithRootObject(minions), forKey: "minions") 

    self.refreshControl?.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged) 
} 

func handleRefresh(refreshControl: UIRefreshControl) { 
    self.minions = Minion.fetchMinionData() 
    for minion in minions { 
     println(minion.now!) 
    } 
    self.tableView.reloadData() 
    refreshControl.endRefreshing() 
} 

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

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("minionCell", forIndexPath: indexPath) as! UITableViewCell 

    let minion = minions[indexPath.row] 

    if let name = minion.name { 
     cell.imageView?.image = UIImage(named: minion.name!) 
     cell.textLabel?.text = minion.name ?? "Minion" 
     cell.detailTextLabel?.text = "Data: \(minion.now!)" 
    } else { 
     cell.imageView?.image = UIImage(named: "Dave") 
     cell.textLabel?.text = "No data available." 
     cell.detailTextLabel?.text = "Sorry, nothing to present here!" 
    } 

    return cell 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "ShowDetail" { 
     let indexPath = self.tableView.indexPathForSelectedRow() 
     //println(indexPath) 
     let minionDetail = minions[indexPath!.row] 
     let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailedViewController 
     controller.detailItem = minionDetail 
    } 
} 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    if let selectedIndexPath = self.tableView.indexPathForSelectedRow() { 
     self.tableView.deselectRowAtIndexPath(selectedIndexPath, animated: true) 

    } 
} 
} 
+0

Это сработало отлично, @ Amit89! Большое вам спасибо за разъяснение. Для меня это имело гораздо больше смысла и позволило мне продолжить учебу. Я ценю это! – ZbadhabitZ

+0

Рад помочь вам ... Счастливое быстрое обучение – Amit89