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

在Swift中调用函数/从TableViewController(和其他)外部传递数据,swift,Swift,在我的应用程序中,有一个屏幕分为两个ViewController——LadderViewController和GameHistoryTableViewController,它们位于一个容器中。我希望用户能够通过点击LadderView中的某些内容来过滤表中的数据。我尝试使用代理解决此问题: LadderViewController: delegate = GameHistoryTableViewController() func imageTapped(imageIndex: Int) {

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

LadderViewController:

delegate = GameHistoryTableViewController()
func imageTapped(imageIndex: Int) {
    delegate?.selectedHeroNumber(imageIndex)
}
GameHistoryTableViewController:(符合委托协议并从中执行一项功能)


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

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

例如,您可以有以下内容

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等从每个控制器访问此模型。

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

例如,您可以有以下内容

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等从每个控制器访问此模型。

下面是一个您希望执行的委派示例。在这种情况下,它是比单例更好的解决方案;)

声明一个新的协议调用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)
}
 // 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()
  }
  ...

}
GameHistoryTableViewController:

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

}

下面是一个你想做的委托的例子。在这种情况下,它是比单例更好的解决方案;)

声明一个新的协议调用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)
}
 // 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()
  }
  ...

}
GameHistoryTableViewController:

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

}


这是制造单身汉的老办法。现在有一个更好的方法:我想我有了这个想法——创建一个“数据存储”类,我将从程序中的不同点访问它。但是我仍然无法重新加载表,因为我不会有表的“显示”实例。。。似乎我必须通过通知来完成。如果你熟悉NSNotifications,那么你可以在heroNumber的didSet中设置一个。这样,每次修改时,您都可以调用以重新加载表数据。我不太确定Eric指的是什么,也许他可以详细说明?是的,只是不想使用它们,因为它对我来说似乎有些粗略,也不是很优雅的解决方案。不过,我想这是唯一的一个。我知道你的意思!有一些很好的解决方案,本页的第二个委托模式可能会对您有所帮助。这是制造单身汉的老办法。现在有一个更好的方法:我想我有了这个想法——创建一个“数据存储”类,我将从程序中的不同点访问它。但是我仍然无法重新加载表,因为我不会有表的“显示”实例。。。似乎我必须通过通知来完成。如果你熟悉NSNotifications,那么你可以在heroNumber的didSet中设置一个。这样,每次修改时,您都可以调用以重新加载表数据。我不太确定Eric指的是什么,也许他可以详细说明?是的,只是不想使用它们,因为它对我来说似乎有些粗略,也不是很优雅的解决方案。不过,我想这是唯一的一个。我知道你的意思!有一些很好的解决方案,本页的第二个委托模式可能会对您有所帮助。但我不知道如何获取我的ladderView。。。这和从另一边获取显示的表是一样的问题。所以,我需要获得关于var ladderView:ladderViewController=。。。我很想知道这是怎么回事,也许他的意思是-让ladderView=LadderViewController()是这样的。但我必须在故事板中从您的架构中获得一些信息,以了解您是如何设计的。你用什么在你的分割屏幕上有两个视图控制器?这会导致和我一样的问题,我创建的ladderView不会是用户点击的ladderView。在LadderViewController中只有一个单体会是可怕的做法吗?然后ladderView可以和singleton持平,然后你就可以离开了…我不知道如何得到我的ladderView,尽管。。。这和从另一边获取显示的表是一样的问题。所以,我需要获得关于var ladderView:ladderViewController=。。。我很想知道这是怎么回事,也许他的意思是-让ladderView=LadderViewController()是这样的。但我必须在故事板中从您的架构中获得一些信息,以了解您是如何设计的。你用什么在你的分割屏幕上有两个视图控制器?这会导致和我一样的问题,我创建的ladderView不会是用户点击的ladderView。在LadderViewController中只有一个单体会是可怕的做法吗?然后ladderView可以和singleton并驾齐驱。。。