我有一个名为PlayerStore
的模型对象,它是Player
个对象的数组。这些内容会添加到MainVC
视图控制器的UITableView
中。在这里,用户可以添加Player
中显示的UITableView
个对象。
我有一个名为UILabel
@IBOutlet
的{{1}}我希望仅在pressPlusLbl
中没有玩家时显示。
当PlayerStore
中的视图加载时,我可以轻松处理这个问题:
ViewDidLoad
但我总是希望我的视图控制器能够监听模型对象(PlayerStore)以了解它何时为空: override func viewDidLoad() {
super.viewDidLoad()
players = store.getAllPlayers()
emptyTableShowsLabel()
}
func emptyTableShowsLabel(){
if !store.hasPlayers(){
pressPlusLbl.isHidden = false
// TODO: maybe animate this view?
// TODO: hide the table
} else {
pressPlusLbl.isHidden = true
// TODO: bring back the table
}
}
以便我可以再次显示!store.hasPlayers()
。
编辑1:
不知道它是否相关,但这是用户可以从TableView中删除的地方之一:
pressPlusLbl
编辑2:
希望从func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if (editingStyle == .delete){
store.deletePlayer(row: indexPath.row)
players = store.getAllPlayers()
tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.bottom)
}
}
实现委托模式。这就是我所拥有的,但不太有效。
PlayerStore
(View Controller)中:
MainVC.Swift
在protocol PlayerIncrementor {
func increment(playerPosition: Int)
func decrement(playerPosition: Int)
func isStoreEmpty()
}
class MainVC: UIViewController, UITableViewDataSource, UITableViewDelegate, PlayerIncrementor {
...
func isStoreEmpty() {
store.delegate = self
if store.hasPlayers() {
pressPlusLbl.isHidden = true
} else {
pressPlusLbl.isHidden = false
}
}
}
(型号)
PlayerStore.swift
答案 0 :(得分:1)
您可以使用委托模式。
protocol MainViewControllerDelegate {
func playersDidChange()
}
class MainViewController: UIViewController, MainViewControllerDelegate {
func playersDidChange() {
// Check store to determine if label is to be shown
}
}
然后在你的玩家商店中创建一个对委托的引用并调用delegate.playersDidChange函数。
当您从玩家商店添加/删除玩家时,您可以致电该代表。例如,
class PlayerStore {
func addPlayer(player: Player) {
// Add player to your array
delegate.playersDidChange()
}
func removePlayer(player: Player) {
// Remove player from your array
delegate.playersDidChange()
}
}
所以在你的UITableViewDelegate函数中,
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)
通过调用store.removePlayer函数,您的标签isHidden将由MainViewControllerDelegate处理。
此外,您只需在初始化商店后立即设置store.delegate = self一次。
答案 1 :(得分:0)
删除行后调用checkTableData():
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if (editingStyle == .delete){
store.deletePlayer(row: indexPath.row)
players = store.getAllPlayers()
tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.bottom)
checkTableData()
}
}
func checkTableData() {
if !store.hasPlayers(){
pressPlusLbl.isHidden = false
// TODO: maybe animate this view?
// TODO: hide the table
} else {
pressPlusLbl.isHidden = true
// TODO: bring back the table
}
}
不要忘记重新加载tableView。
答案 2 :(得分:0)
检查这个的最佳方法是基本上编辑数据源。因此,在您的情况下numberOfRowsForSection
,commitEditingStyle
。如果您还尝试插入,则可能需要在数据源计数增加时删除标签。