当变量满足条件

时间:2016-10-04 04:04:00

标签: ios swift uiviewcontroller uilabel swift3

我有一个名为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

3 个答案:

答案 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)

检查这个的最佳方法是基本上编辑数据源。因此,在您的情况下numberOfRowsForSectioncommitEditingStyle。如果您还尝试插入,则可能需要在数据源计数增加时删除标签。