Swift: 使用滑块更新 PageView 中的 TableView 数据
Swift: Update TableView Data in PageView Using Slider
我有一个包含主视图控制器和页面视图控制器的项目,它们都始终可见(见图)
主视图控制器包含一个滑块,页面视图控制器包含几个页面,每个页面都有一个 table 视图实例。查看控制器:
- DataViewController:用于页面浏览数据
- TableViewCell(包括 xib):构建 table 视图单元格
- MainViewController:用于主视图,包含滑块
我的问题是如何在用户调整 MainViewController 中的滑块时实时更新页面视图中的 table 视图。我的代码:
在 TableViewCell 中:
@IBOutlet weak var outputLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
class var reuseIdentifier: String {
return "IngredientCell"
}
class var nibName: String {
return "IngredientTableViewCell"
}
func configureResultCell(text: String) {
outputLabel.text = text
}
在 DataViewController 中:
...
var results: [String]?
override func viewDidLoad() {
super.viewDidLoad()
registerNib()
}
...
}
extension DataViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let int = results?.count {
return int
}
return 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
print("cellforrowat", results)
if let cell = tableView.dequeueReusableCell(withIdentifier: IngredientTableViewCell.reuseIdentifier, for: indexPath) as? IngredientTableViewCell {
if let text = results?[indexPath.row] {
cell.configureResultCell(text: text)
}
return cell
}
return UITableViewCell()
}
}
在 MainViewController 中:
@IBAction func sliderValueChanged(_ sender: UISlider) {
guard let dataViewController = storyboard?.instantiateViewController(identifier: String(describing: DataViewController.self)) as? DataViewController else {
return
}
dataViewController.results = [NEW_VALUES]
DispatchQueue.main.async {
dataViewController.tableView.reloadData()
}
}
基本上,DataViewController 中的 table 视图不会更新为新值。任何建议表示赞赏
您的错误在 MainViewController
方法中:sliderValueChanged
。您会看到每次调整滑块时都会实例化(创建)DataViewController
的新实例。为了按照您的预期工作,您必须保存所呈现的实例 DataViewController
并使用此实例而不是每次都创建一个新实例。
为了实现这一点,我建议您使用委托模式,参考此处:https://learnappmaking.com/delegation-swift-how-to/。此模式将帮助您在两个视图控制器之间安全地建立“通信”。
我有一个包含主视图控制器和页面视图控制器的项目,它们都始终可见(见图)
主视图控制器包含一个滑块,页面视图控制器包含几个页面,每个页面都有一个 table 视图实例。查看控制器:
- DataViewController:用于页面浏览数据
- TableViewCell(包括 xib):构建 table 视图单元格
- MainViewController:用于主视图,包含滑块
我的问题是如何在用户调整 MainViewController 中的滑块时实时更新页面视图中的 table 视图。我的代码:
在 TableViewCell 中:
@IBOutlet weak var outputLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
class var reuseIdentifier: String {
return "IngredientCell"
}
class var nibName: String {
return "IngredientTableViewCell"
}
func configureResultCell(text: String) {
outputLabel.text = text
}
在 DataViewController 中:
...
var results: [String]?
override func viewDidLoad() {
super.viewDidLoad()
registerNib()
}
...
}
extension DataViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let int = results?.count {
return int
}
return 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
print("cellforrowat", results)
if let cell = tableView.dequeueReusableCell(withIdentifier: IngredientTableViewCell.reuseIdentifier, for: indexPath) as? IngredientTableViewCell {
if let text = results?[indexPath.row] {
cell.configureResultCell(text: text)
}
return cell
}
return UITableViewCell()
}
}
在 MainViewController 中:
@IBAction func sliderValueChanged(_ sender: UISlider) {
guard let dataViewController = storyboard?.instantiateViewController(identifier: String(describing: DataViewController.self)) as? DataViewController else {
return
}
dataViewController.results = [NEW_VALUES]
DispatchQueue.main.async {
dataViewController.tableView.reloadData()
}
}
基本上,DataViewController 中的 table 视图不会更新为新值。任何建议表示赞赏
您的错误在 MainViewController
方法中:sliderValueChanged
。您会看到每次调整滑块时都会实例化(创建)DataViewController
的新实例。为了按照您的预期工作,您必须保存所呈现的实例 DataViewController
并使用此实例而不是每次都创建一个新实例。
为了实现这一点,我建议您使用委托模式,参考此处:https://learnappmaking.com/delegation-swift-how-to/。此模式将帮助您在两个视图控制器之间安全地建立“通信”。