Ios Swift:将变量从tableViewCell发送到父视图
我在从Firebase获取数据的视图中有一个动态表。 我需要将数据从TableViewCell中的标签传输到视图中的标签。由于这发生在同一屏幕上,因此无法实现prepareForSegue方法。我目前正在基于tableViewCell中标签的值编写数据库,然后在视图中的标签中获取它。但有相当大的滞后,有时数值也不同。有什么办法可以在当地做吗?我必须创建一个文件,一个用于TableViewCell,另一个用于视图本身 另外,我对Swift和iOS还比较陌生 我希望将数据从A点发送到B点 这是抵押物控制器Ios Swift:将变量从tableViewCell发送到父视图,ios,swift,Ios,Swift,我在从Firebase获取数据的视图中有一个动态表。 我需要将数据从TableViewCell中的标签传输到视图中的标签。由于这发生在同一屏幕上,因此无法实现prepareForSegue方法。我目前正在基于tableViewCell中标签的值编写数据库,然后在视图中的标签中获取它。但有相当大的滞后,有时数值也不同。有什么办法可以在当地做吗?我必须创建一个文件,一个用于TableViewCell,另一个用于视图本身 另外,我对Swift和iOS还比较陌生 我希望将数据从A点发送到B点 这是抵押物
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))
}
}
}
为单元格类创建委托:
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))
}
}
}
然后,在视图控制器中,您要基于此单元格的交互执行操作,请确保符合创建的协议
因此,在cellForRow
中,在您的wareveviewcontroller
中,您将添加:
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
}
然后,您可以将其添加到您的SurveViewController:
//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
}
}
您正在查找的数据可能重复
将数据传回上一个视图控制器
在重复链接中,在单元格类中创建一个委托,然后在viewController中实现回调class@Tj3n这个问题是基于目标C的,如果我没有弄错的话,我不能快速回答。第二个答案是快速回答,但他在用于获取id的TableViewController中使用了“let local_id=reward.Rewardd”。你会如何对一名代表进行同样的操作?