如何使用视图控制器重新加载 tableview (swift)
Posted
技术标签:
【中文标题】如何使用视图控制器重新加载 tableview (swift)【英文标题】:How to reload tableview using view controller (swift) 【发布时间】:2015-10-28 20:40:42 【问题描述】:我对此很陌生。我花了几个小时来解决有关此主题的各种问题,但找不到适合我的问题的答案。
我有一个带有 tableview 作为子视图的 viewcontroller(不是 tableviewcontroller)。我的问题是如何在视图控制器的 :viewwillappear 方法中重新加载表数据。在方法内部,我无法“访问”tableview 实例。 (我也知道我不能使用 reloaddata() 因为我没有使用 tableviewcontroller)。
您知道任何简单的解决方案吗? (我非常认为协议可以在这里提供帮助?)
这就是代码:
class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate
var Person_data = [Person]()
override func viewDidLoad()
super.viewDidLoad()
let tb: UITableView = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)
tb.dataSource = self
tb.delegate = self
super.view.addSubview(tb)
fetch_data()
func tableView(tableview: UITableView, numberOfRowsInSection section: Int) -> Int
let rows = Person_data.count
return rows
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell: UITableViewCell = UITableViewCell()
cell.textLabel?.text = Person_data[indexPath.row].name
return cell
override func viewWillAppear(animated: Bool)
super.viewWillAppear(animated)
fetch_data()
// reload at this point
func fetch_data()
let tb_fetchRequest = NSFetchRequest(entityName: "Person")
do
let tb_fetchResults = try my_moc.executeFetchRequest(tb_fetchRequest) as? [Person]
Person_data = tb_fetchResults!
catch let error as NSError
print("request error: \(error)")
【问题讨论】:
【参考方案1】:你的问题是 tb
是一个局部变量,所以它在 viewDidLoad()
之外是不可见的。
如果您将 tb
设为视图控制器的属性(也称为实例变量),那么您可以从控制器的任何方法中使用它:
class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate
var Person_data = [Person]()
private var tb: UITableView? // Now the scope of tb is all of ViewController3...
override func viewDidLoad()
super.viewDidLoad()
// ...so it is visible here...
tb = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)
...
override func viewWillAppear(animated: Bool)
super.viewWillAppear(animated)
fetch_data()
tb?.reloadData() // ...and it is also visible here.
请注意,在您的代码中,tb
是一个局部变量这一事实并不意味着您的 UITableView
对象会在 viewDidLoad()
完成时消失。这意味着您对UITableView
的引用 消失了。表格视图对象本身存在,因为它已添加到您的视图层次结构中,但您不再有对它的引用,因为您的变量超出了范围。
要进一步了解变量和它们引用的对象之间的区别,请搜索“范围”和“按引用传递”。
【讨论】:
感谢您的提示。我深入了解了实例变量 还可以看看@Arsen 的回答,它展示了如何防止 tableView 成为一个可选的立即初始化它。该技术通常不适用于 UI 元素,但在这种情况下确实有效。 感谢 2019 年的 Swift 4! ?【参考方案2】:您可以在viewWillAppear:
中访问您的tableView
IBOutlet
,也可以拨打reloadData
。我不知道你为什么认为你不能,但它应该可以正常工作。
【讨论】:
【参考方案3】:您必须创建一个链接到 tableView 的变量并在 viewWillAppear 之前创建它。
class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate
private let tableView = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)
var Person_data = [Person]()
override func viewDidLoad()
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
super.view.addSubview(tb)
fetch_data()
override func viewWillAppear(animated: Bool)
super.viewWillAppear(animated)
fetch_data()
tableView.reloadData()
【讨论】:
【参考方案4】:class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate
private let tableView = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)
var Person_data = [Person]()
override func viewDidLoad()
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
super.view.addSubview(tb)
fetch_data()
override func viewWillAppear(animated: Bool)
super.viewWillAppear(animated)
fetch_data()
tableView.reloadData()
【讨论】:
【参考方案5】:快速重新加载tableView
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
//This is outlet of tableView...
@IBOutlet public var userTableView : UITableView!
override func viewDidLoad()
super.viewDidLoad()
userTableView.delegate = self
userTableView .datasource = self
override func viewWillAppear(animated: Bool)
super.viewWillAppear(animated)
fetchData()
func fetchData()
//Here you can fetch your required data
//Here the tableView will be reload...
userTableView.reloadData()
【讨论】:
在 fetchdata() 函数中使用 userTableView.reloadData()。您需要为 fetchdata 提供更多上下文/代码,以便任何人正确回答。以上是关于如何使用视图控制器重新加载 tableview (swift)的主要内容,如果未能解决你的问题,请参考以下文章
如何从其他类重新加载整个 tableview 控制器 [关闭]
tableView.reloadData() 和 DispatchQueue 无法在不同的视图控制器中重新加载 tableview
在另一个视图控制器展开 segue 后重新加载 UIView 数据上的自定义 tableview
带有 fetchedResultsController 的 Tableview 在应用重新启动或视图重新加载之前不会更新新内容