GameHistoryTableViewController

GameHistoryTableViewController

在我的应用程序中,我有一个屏幕分为两个viewcontroller-LadderViewController和GameHistoryTableViewController,这两个viewcontroller位于一个容器中。我希望用户能够通过点击LadderView中的某些内容来过滤表中的数据。我试着用委托来解决这个问题:
梯形视图控制器:

delegate = GameHistoryTableViewController()
func imageTapped(imageIndex: Int) {
    delegate?.selectedHeroNumber(imageIndex)
}

GameHistoryTableViewController:(符合委托协议并从中实现一个函数)
func selectedHeroNumber(heroNumber: Int) {
    let filteredGames = filterGamesFromHeroNumber(heroNumber)
    tableDataSource = filteredGames
    self.tableView.reloadData()
}

但这不起作用,因为我在LadderViewConroller中声明的委托是GameHistoryTableViewController的另一个实例,而不是(对用户)显示的那个实例。我不知道如何访问GameHistoryTableViewController的“可见”实例(表)。。。那么,这里应该如何使用授权呢?或者我应该使用另一种方法(如果是,应该使用哪种方法)?我基本上需要根据用户点击的内容来更改表的数据源,可以说是“从外部”(data source是GameHistoryTableViewController类中的一个属性)。

最佳答案

下面是一个你想委托的例子。在这种情况下,这是比singleton更好的解决方案;)
声明一个新的协议调用海洛因信息:

protocol HeroInfo: class {
    func selectedHeroNumber(heroNumber: Int);
}

梯形视图控制器:
//create the delegation
weak var delegate:HeroInfo?

func imageTapped(imageIndex: Int) {
    //call the delegate method
    delegate?.selectedHeroNumber(imageIndex)
}

游戏历史表视图控制器:
 // Here get the protocol HeroInfo inheritance
class userTableViewController: UITableViewController, HeroInfo {

  override func viewDidLoad() {
      super.viewDidLoad()
      //Here get your Ladder view in a splitView
      if let split = self.splitViewController {
            let controllers = split.viewControllers
            self.ladderViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? ladderViewController
            //register it to delegate
            self.ladderViewController?.delegate = self
        }
  }
  ...
  // Here is your method of your protocol that you must conform to
  func selectedHeroNumber(heroNumber: Int) {
    let filteredGames = filterGamesFromHeroNumber(heroNumber)
    tableDataSource = filteredGames
    self.tableView.reloadData()
  }
  ...

}

10-08 05:10