在Swift中调用TableViewController(和其他)外部的函数/传递数据

时间:2016-04-20 13:24:29

标签: swift

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

LadderViewController:

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的实例(表)虽然......那么,如何在这里使用委托?或者我应该使用另一种方法(如果是,那是什么类型)?我基本上需要根据用户点击的内容来更改表格的数据源,可以说是来自外部" (dataSource是我的GameHistoryTableViewController类中的一个属性)。

2 个答案:

答案 0 :(得分:1)

有几种方法可以实现这一点,我有一个类似的设置,我使用带有单例的模型类来存储相关数据。

例如,您可以拥有以下

class dataModel {

  static let sharedInstance = dataModel()

  private var _heroNumber = Int()

private init() {}

  var heroNumber: Int = {

    return _heroNumber

  }

  func setHero(hero: Int) -> Int {

    return _heroNumber

  }
 }
}

然后,您可以使用dataModel.sharedInstance.heroNumber等从每个控制器访问此模型...

答案 1 :(得分:1)

以下是您希望执行委托的示例。在这种情况下,它比单身人士更好;)

声明一个新的协议调用HeroInfo:

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

LadderViewController:

//create the delegation
weak var delegate:HeroInfo?

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

GameHistoryTableViewController:

 // 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()
  }
  ...

}