【发布时间】:2016-10-04 04:03:59
【问题描述】:
我有一个名为PlayerStore 的模型对象,它是Player 对象的数组。这些被添加到MainVC 视图控制器的UITableView。在这里,用户可以添加Player 显示在UITableView 中的对象。
我有一个UILabel,它是一个名为pressPlusLbl 的@IBOutlet,我只想在PlayerStore 中没有玩家时才显示它。
当视图在ViewDidLoad 中加载时,我可以轻松地处理这个问题:
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
}
}
但我总是希望我的视图控制器监听模型对象 (PlayerStore) 以知道它何时为空:!store.hasPlayers(),以便我可以再次显示 pressPlusLbl。
编辑 1:
不知道是否相关,但这里是用户可以从 TableView 中删除的地方之一:
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)
}
}
编辑 2:
希望从PlayerStore 实现委托模式。以下是我所构建但不太有效的内容。
在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(型号)
class PlayerStore {
...
var delegate: PlayerIncrementor!
private var _playerArray = [Player]()
func hasPlayers() -> Bool {
return !_playerArray.isEmpty
}
...
}
【问题讨论】:
-
tableView如何收到用户删除player的通知 -
@New16 添加了代码。
-
@Macness 请检查我的回答并回复
标签: ios swift uiviewcontroller uilabel swift3