Ios 难以在Swift中重新加载TableView

Ios 难以在Swift中重新加载TableView,ios,uitableview,swift,Ios,Uitableview,Swift,我浏览了关于这个主题的各种教程和帖子,但我似乎没有找到一个适合我的项目的解决方案。本质上,我正在尝试在iOS上的TableView中实现“拉入刷新”,然后通过web服务器重新加载一些数据,然后使用最新的数据集重新加载我的表 从测试来看,我的“拉入刷新”似乎正在工作,其中我能够成功地从我的web服务请求中拉入最新数据。然而,似乎失败的是,表的单元格实际上没有使用最新数据进行更新。以下是我在TableViewController中的内容 我的“minion.now!”变量是一些带有当前时间戳的JSO

我浏览了关于这个主题的各种教程和帖子,但我似乎没有找到一个适合我的项目的解决方案。本质上,我正在尝试在iOS上的TableView中实现“拉入刷新”,然后通过web服务器重新加载一些数据,然后使用最新的数据集重新加载我的表

从测试来看,我的“拉入刷新”似乎正在工作,其中我能够成功地从我的web服务请求中拉入最新数据。然而,似乎失败的是,表的单元格实际上没有使用最新数据进行更新。以下是我在TableViewController中的内容

我的“minion.now!”变量是一些带有当前时间戳的JSON数据,从我的println输出中,我可以看到它实际上是在拉刷新时更新的。然而,我的表格的单元格似乎不会随着每次拉动而更新


任何想法都将不胜感激。谢谢大家!

在下面的方法中,您正在创建一个局部变量,它与类属性没有任何关系

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)

    }
}
}

对于常量,在单元格变量中使用var。这非常有效,@Amit89!非常感谢您的澄清。这对我来说更有意义,让我可以继续学习。我很感激!
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)

    }
}
}