【问题标题】:How do i refresh a TableView after some data will changed?某些数据更改后如何刷新 TableView?
【发布时间】:2017-06-12 17:32:12
【问题描述】:

我只想更改一个名为 Network 的类中的用户列表。而且我不明白如何在 userList 更改后进行 TableView 更新。我将在下面的代码中向您展示一个示例和详细的问题。

// Network.swift
class Network {
    var userList: [User] = []

    // Next functions may change userList array
    // For example, the data came from the server, and update the userList with new data
}

// App delegate
class AppDelegate: UIResponder, UIApplicationDelegate {
    var network: Network = Network()

    ..
}

// File TableViewController.swift
class TableViewController: UITableViewController {
    …
    var userList: [User] = [] // Here I want to have a full copy of the array from Network class

    override func viewDidLoad() {
        super.viewDidLoad()

        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        self.userList = appDelegate.network.userList // Just copy an array
        // And I want that after each update appDelegate.network.userList I updated the table, how to do it better?

        self.tableView.reloadData()
    }  
}

【问题讨论】:

  • 你的架构非常混乱和糟糕(为什么要在 appdelegate 中保存一个 var)这个列表是如何更新的?谁是网络来检查更新的呼叫者?

标签: arrays swift uitableview


【解决方案1】:

正如@JDM 在评论中提到的那样,您的架构一团糟。
尝试使用协议进行此委托:

// Network.swift
protocol UsersUpdatedProtocol {
  func usersListUpdated(list: [User])
}
class Network {
  var userList: [User] = [] {
    didSet {
      delegate?.usersListUpdated(list: userList)
    }
  }
  var delegate: UsersUpdatedProtocol?
  init(delegate d: UsersUpdatedProtocol) {
    super.init()
    delegate = d
  }
}

// File TableViewController.swift
class TableViewController: UITableViewController, UsersUpdatedProtocol {
  var userList: [User] = []

  override func viewDidLoad() {
    super.viewDidLoad()
    let _ = Network(delegate: self)
  }
  func usersListUpdated(list: [User]) {
    self.userList = list
    self.tableView.reloadData()
  }
}

【讨论】:

  • 如果只有一件事要响应用户列表的更新,此解决方案将起作用。如果不止一件事会响应,那么您最好使用通知
【解决方案2】:

您可以使用通知。每当用户列表更新时,发布这样的通知:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "UserlistUpdate"), object: nil)

然后,在 viewDidLoad 中添加:

NotificationCenter.default.addObserver(self, selector: #selector(TableViewController.reloadData), name: NSNotification.Name(rawValue: "UserlistUpdate"), object: nil)

附:到目前为止,关于您的架构,我会让 TableViewController 为 Network 保存一个变量,而不是保存它自己的用户数组。然后,在 AppDelegate 中:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    let network = Network()

    // Access the TableViewController and set its network variable
    let tableViewController = window!.rootViewController as! TableViewController
    tableViewController.network = network

【讨论】:

  • 如果不止一个东西可以响应用户列表中的变化,这种方法会很好,因为他们每个人都可以订阅通知。
  • 至于架构,我建议采用单例方法:public class MyClass { static let sharedInstance = MyClass() private init() { } }
猜你喜欢
  • 1970-01-01
  • 2015-10-03
  • 2014-08-20
  • 2019-05-21
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
相关资源
最近更新 更多