Swift iOS - 如何将 EqualGain 直接从 TableViewCell 的子类中获取的值传递给 TableView 的 didSelectRow?



在任何人建议从PlayerController的ViewWillAppear中提取firebase数据之前,我已经知道如何做到这一点,如果那样做,我知道如何将数据传递给ScoreController。在这种情况下,我需要直接从单元格内部拉数据,并以某种方式将数据传递回那里。

我在PlayerController内部有一个桌面视图,该表显示了每个玩家的randompower,姓名和得分。在TableView的单元格中,我使用函数getScoreDataFromFirebase()从Firebase中取出名称并得分。该函数位于TableView的PlayerCell内部,一旦我从Firebase获得值,我就在当时和那里初始化单元格的名称和评分插座。

在TableView的CellForrowatIndExpath内部,我称为cell.getScoreDataFromFirebase(),一切正常,因为两个插座都显示正确的值。

从那时起,我有一个得分控制器。选择表视图单元格时,分数将发送到得分控制器。

问题是因为我直接从单元格内部拉动数据我可以将得分(从firebase提取(转移到得分控制器的唯一途径是第1套didSet分数属性。单元格。

从firebase 2nd中获取分数数据时仍在单元格内,我用它初始化得分属性

在TableView的CellForatindExpath中,我使用if let将值从单元的得分属性传递给TableData。

当我第一次尝试将tabledata的indexpath发送到得分控制器时,有时即使单元格的得分属性肯定具有值(我曾经打破要检查(。如果我选择可见的前几个表观视图单元格中的任何一个,它们将具有分数属性的零值。但是,如果我在细胞中进一步向下滚动并备份,那么相同的单元格将不再具有零分数属性。

我发现的是if let语句在拉动Firebase代码之前正在运行,因此在现场的前几个单元格中,得分属性为零。奇怪的是,一旦我开始滚动,一切都很好。

我如何通过直接从单元格到tableview的didSelectrow?

传递一个值

PlayerModel:

class PlayerModel{
   name:String?
   score:String?
   randomPower:String?
}

TableViewCell子类:

class PlayerCell:UITableViewCell{
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var scoreLabel: UILabel!
    @IBOutlet weak var randomPowerLabel: UILabel!
    internal var score: String?{
        didSet{
            print("**********(score ?? "*********")")
        }
    }
    override func prepareForReuse() {
         super.prepareForReuse()
         nameLabel.text = " "
         scoreLabel.text = " "
    }
    func getScoreDataFromFirebase(){
         let scoreRef = usersRef?.child("score")
         scoreRef?.observe( .value, with: {
              (snapshot) in
              for child in snapshot.children{
                  let user = child as! DataSnapshot
                      for player in user.children{
                           let eachPlayer = player as! DataSnapshot
                           if let dict = eachPlayer.value as? [String:Any]{
                                 let name = dict["name"] as? String ?? " "
                                 let score = dict["score"] as? String ?? " "
                                 self.nameLabel.text = name
                                 self.scoreLabel.text = score
                                 self.score = score
                           }
                      }
              }
         }
    }
}

tableview:

class PlayerController: UITableViewDataSource, UITableViewDelegate{
@IBOutlet weak fileprivate var tableView: UITableView!
var players = [PlayerModel]() // this array is populated with data from a previous vc. The number of players in the array are the same exact number of players that's pulled from the getScoreDataFromFirebase() function
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.reloadData()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return players.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "PlayerCell", for: indexPath) as! PlayerCell
     let cellData = players[indexPath.row]     
     cellData.randomPowerLabel.text = cellData.power
     cell.getScoreDataFromFirebase()
     if let score = cell.score{
        cellData.score = score
     }
     return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    guard let indexPath = tableView.indexPathForSelectedRow else { return }
    let scoreVC = storyboard?.instantiateViewController(withIdentifier: "ScoreController") as! ScoreController
    scoreVC.score = players[indexPath.row].score
}

您可以使用委托
实现此目标创建协议

protocol UpdateValueDelegate: class {
    func changeValue(score: String, row: Int)
}  

您的UIViewController应该看起来像这样:

PlayController : UITableViewDataSource, UITableViewDelegate, UpdateValueDelegate  
{
       var scoreDict:[String:String] = [:]
        //
       //  
      func changeValue(score: String, row: Int)
      {
            self.scoreDict["(row)"] = score
      }
}  

cellForRowAtIndexPath set cell.delegate = self cell.row = indexpath.row

您的UITableViewCell应该看起来像这样:

class PlayerCell:UITableViewCell: UITableViewCell
{
    weak  var delegate: UpdateValueDelegate?
    var row: Int?
    //
    //
} 

最终从> getCoreDatafromfirebase 通过调用委托函数:

func getScoreDataFromFirebase()
{
    //
    //
    delegate. changeValue(score: localScore, row: self.row)
}

现在,您可以使用Global Dictionary **评分**可以轻松地传递给didSelectRow中的ViewController中值。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
    var score = self.scoreDict["(indexPath.row)"]
   // Use score
}

最新更新