ios - Swift:将变量从 tableViewCell 发送到父 View

标签 ios swift

我在从 Firebase 获取数据的 View 中有一个动态表。 我需要将数据从 TableViewCell 中的标签传输到 View 中的标签。由于这是在同一屏幕上发生的,因此无法实现 prepareForSegue 方法。我目前正在根据 tableViewCell 中标签的值编写数据库,然后在 View 中的标签中获取它。但是存在相当大的滞后,有时值也会不同。有没有办法在本地做?我必须归档,一份用于 TableViewCell,一份用于 View 本身。

P.S 我对 Swift 和 iOS 还很陌生

This is what my Screen currently looks like我希望将数据从 A 点发送到 B 点

这是 PledgeViewController

    import UIKit
    import Foundation
    import FirebaseDatabase
    import Firebase

    class PledgeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{


var getID: String!
var rewards = [Rewards]()
var ticket_count: Int = 0
var ref: DatabaseReference!
let userID = Auth.auth().currentUser!.uid
var rewardID: String!
var total_pledge: Int = 0

@IBOutlet weak var pledgeAmtLabel: UILabel!
@IBOutlet weak var RewardChooseTable: UITableView!
@IBAction func pledgeBtn(_ sender: Any) {
    //get the text from the label and run all the checks to see if the tickets are available
    //just sending user to the next screen for now




}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let reward = rewards[indexPath.row]
    let id = reward.rewardID
    //reward.countUp()

    print("The reward that was touched is: " + id )
    print("One of the buttons were touched")
}

let RewardRef = Database.database().reference().child("Rewards")


func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return rewards.count
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "TakePledgeCell", for: indexPath) as! PledgeTableViewCell
    let reward = rewards[indexPath.row]
    cell.reward = reward
    cell.currentID = getID

    cell.plusBtnAction = { sender in

        let reward = self.rewards[indexPath.row]
        cell.reward = reward
        let local_id = reward.rewardID

        self.ref=Database.database().reference().child("Fund_Project_Request").child(self.getID).child(self.userID).child(local_id).child("Ticket_count")


        self.ref.observeSingleEvent(of: .value, with: { (snapshot) in
            // Get user value

            if snapshot.value is NSNull{
                self.ticket_count = 0
                self.ticket_count += 1
                self.ref.setValue(self.ticket_count)

                Database.database().reference().child("Rewards").child(self.getID).child(local_id).child("reward_ticket_amount").observeSingleEvent(of: .value, with: { (snapshot) in
                    // Get user value
                    let reward_amt = snapshot.value as! Int

                    let current_value = Int(self.pledgeAmtLabel.text!)

                    print("current value in the label is:" + String(current_value!) )
                    print("new updated value is:" + String(reward_amt))
                    print("reward_amt is:", reward_amt)


                    self.pledgeAmtLabel.text = String(reward_amt + current_value!)

                    self.total_pledge = reward_amt + current_value!

                }) { (error) in
                    print(error.localizedDescription)
                }



            }


            else{
                self.ticket_count = snapshot.value as! Int
                self.ticket_count += 1
                self.ref.setValue(self.ticket_count)

                Database.database().reference().child("Rewards").child(self.getID).child(local_id).child("reward_ticket_amount").observeSingleEvent(of: .value, with: { (snapshot) in
                    // Get user value
                    let reward_amt = snapshot.value as! Int

                    let current_value = Int(self.pledgeAmtLabel.text!)

                    print("current value in the label is:" + String(current_value!) )
                    print("new updated value is:" + String(reward_amt))
                    print("reward_amt is:", reward_amt)


                    self.pledgeAmtLabel.text = String(reward_amt + current_value!)


                    self.total_pledge = reward_amt + current_value!

                }) { (error) in
                    print(error.localizedDescription)
                }

            }


        }) { (error) in
            print(error.localizedDescription)
        }


        // Do whatever you want from your button here.
    }



    cell.minusBtnAction = { sender in

        let reward = self.rewards[indexPath.row]
        cell.reward = reward
        let local_id = reward.rewardID

    self.ref=Database.database().reference().child("Fund_Project_Request").child(self.getID).child(self.userID).child(local_id).child("Ticket_count")
        self.ref.observeSingleEvent(of: .value, with: { (snapshot) in
            // Get user value

            if snapshot.value is NSNull{

            }

            else{

                self.ticket_count = snapshot.value as! Int
                if(self.ticket_count != 0)
                {
                    self.ticket_count -= 1
                    self.ref.setValue(self.ticket_count)

                    Database.database().reference().child("Rewards").child(self.getID).child(local_id).child("reward_ticket_amount").observeSingleEvent(of: .value, with: { (snapshot) in
                        // Get user value
                        let reward_amt = snapshot.value as! Int

                        let current_value = Int(self.pledgeAmtLabel.text!)

                        print("current value in the label is:" + String(current_value!) )
                        print("new updated value is:" + String(reward_amt))
                        print("reward_amt is:", reward_amt)


                        self.pledgeAmtLabel.text = String( current_value! - reward_amt)

                        self.total_pledge = current_value! - reward_amt



                    }) { (error) in
                        print(error.localizedDescription)
                    }





                }
            }


        }) { (error) in
            print(error.localizedDescription)
        }



    }



    return cell

}


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let vc = segue.destination as! SummaryViewController // else {return}
    vc.getID = getID
    vc.pledgeAmt = total_pledge
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)


    RewardRef.child(getID).observe(.value, with: { (snapshot) in
        self.rewards.removeAll()

        for child in snapshot.children {
            let childSnapshot = child as! DataSnapshot
            let reward = Rewards(snapshot: childSnapshot)
            self.rewards.insert(reward, at: 0)
        }

        self.RewardChooseTable.reloadData()
    })

}




override func viewDidLoad() {
    super.viewDidLoad()


    print("The id received from the SingleViewControl is:" + getID)
    }

    }

这是 TableViewCell

   import UIKit
         import Firebase
         import FirebaseDatabase


    class PledgeTableViewCell: UITableViewCell {

var plusBtnAction: ((String) -> Void)?
var minusBtnAction: ((String) -> Void)?

@IBOutlet weak var rewardAmtLabel: UILabel!
@IBOutlet weak var ticketClasslabel: UILabel!
@IBOutlet weak var ticketDescLabel: UILabel!

@IBOutlet weak var ticketCountLabel: UILabel!
@IBOutlet weak var plusBtn: UIButton!
@IBOutlet weak var minusBtn: UIButton!

var ref: DatabaseReference!
var currentID = ""
var ticket_count: Int = 0

@IBAction func minusBtn(_ sender: Any) {

    if var tickCount = Int(ticketCountLabel.text!) {

        if(tickCount > 0)
        {
            tickCount -= 1
            ticketCountLabel.text = String(tickCount)
            self.minusBtnAction?(String(tickCount))
        }

    }


  //  self.minusBtnAction?(String(tickCount))
}


var reward: Rewards! {
    didSet {

        rewardAmtLabel.text = "Rs. " + String(reward.rewardAmt)
        ticketClasslabel.text = reward.reward_class_name
        ticketDescLabel.text = reward.reward_desc
        print(reward.reward_class_name + " is one of the rewards")
    }

}

@IBAction func plusBtn(_ sender: AnyObject) {


    if var tickCount = Int(ticketCountLabel.text!) {
        tickCount += 1
        ticketCountLabel.text = String(tickCount)
        print("The ticket counting before sending is:" + String(tickCount))
        self.plusBtnAction?(String(tickCount))

    }



}


    }

最佳答案

为您的单元类创建一个委托(delegate):

import UIKit
import Firebase
import FirebaseDatabase

//Create delegate for tableview cell to pass information about cell interactions
  //Any parent view that needs this info can be the delegate of each cell

protocol PledgeTableViewCellDelegate: class {
  func minusTapped(id: String, ticketCount: Int)
  func plusTapped(id: String, ticketCount: Int)
}

class PledgeTableViewCell: UITableViewCell {

  //I don't believe you would need these actions anymore
  //var plusBtnAction: ((String) -> Void)?
  //var minusBtnAction: ((String) -> Void)?

  @IBOutlet weak var rewardAmtLabel: UILabel!
  @IBOutlet weak var ticketClasslabel: UILabel!
  @IBOutlet weak var ticketDescLabel: UILabel!

  @IBOutlet weak var ticketCountLabel: UILabel!
  @IBOutlet weak var plusBtn: UIButton!
  @IBOutlet weak var minusBtn: UIButton!

  var ref: DatabaseReference!
  var currentID = ""
  var ticket_count: Int = 0

  //Make this weak to avoid retain cycles
  weak var delegate: PledgeTableViewCellDelegate?

  @IBAction func minusBtn(_ sender: Any) {
    //Maybe use nil coalescing instead of force unwrapping here
    if var tickCount = Int(ticketCountLabel.text ?? "") {
      if(tickCount > 0) {
        tickCount -= 1
        ticketCountLabel.text = String(tickCount)

        //Call delegate function here
        delegate?.minusTapped(id: currentID, ticketCount: tickCount)

        //I believe this can be removed:
          //self.minusBtnAction?(String(tickCount))
      }
    }
  }


  var reward: Rewards! {
    didSet {
      rewardAmtLabel.text = "Rs. " + String(reward.rewardAmt)
      ticketClasslabel.text = reward.reward_class_name
      ticketDescLabel.text = reward.reward_desc
      print(reward.reward_class_name + " is one of the rewards")
    }
  }

  @IBAction func plusBtn(_ sender: AnyObject) {
    //Maybe use nil coalescing instead of force unwrapping here
    if var tickCount = Int(ticketCountLabel.text ?? "") {
      tickCount += 1
      ticketCountLabel.text = String(tickCount)
      print("The ticket counting before sending is:" + String(tickCount))

      //Call delegate function here:
      delegate?.plusTapped(id: currentID, ticketCount: tickCount)

      //I believe this can also be removed
        //self.plusBtnAction?(String(tickCount))
    }
  }
}

然后,在 View Controller 中,您要根据此单元格的交互来执行操作,请确保您符合创建的协议(protocol)。

因此,在 PledgeViewController 中的 cellForRow 中,您将添加:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCell(withIdentifier: "TakePledgeCell", for: indexPath) as! PledgeTableViewCell
  let reward = rewards[indexPath.row]
  cell.reward = reward
  cell.currentID = getID

  //Make this view controller the delegate of the cell
  cell.delegate = self
}

然后你可以将它添加到你的 PledgeViewController 中:

//Add extension to PledgeViewController for tableview cell delegate functions
extension PledgeViewController: PledgeTableViewCellDelegate {
  func minusTapped(id: String, ticketCount: Int) {
    //Do stuff based on cell interaction
  }

  func plusTapped(id: String, ticketCount: Int) {
    //Do stuff based on cell interaction
  }
}

关于ios - Swift:将变量从 tableViewCell 发送到父 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51490124/

相关文章:

javascript - scrollToIndex() 不是函数

ios - 是否不可能将 subview 添加到我的 UITableViewCell 的 contentView 并使其与 contentView 宽度相等?

iPhone 应用程序在 main.m 中崩溃,没有更多信息..?

swift 4。自定义 View 未在自定义初始化中显示

ios - 如何在两个坐标内显示 map ?

javascript - Phonegap 中的解析查询返回错误 100 XMLHTTPRequest 失败

ios - 如何在 swift 3 中将 View Controller 制作为启动画面?

ios - RootView 快速导航

swift - 服务器端 Swift 中的计划任务(Kitura、Vapor、Zewo 等)

ios - 从 Firebafirebase 崩溃报告 OLD 迁移到 Firebase/Crashlytics