UITableViewCell segue to other UITableViewCell 不运行 - 委托为 NIL



问题已得到修复。见帖子 视图控制器中的自定义单元格标签不显示数据

我有一个带有 IBAction 按钮的 UITableViewCell,该按钮调用 查询到火堆。查询运行后,我想转到另一个查询 UITableViewCell并显示数据。我不确定我错过了什么 或者在这里做错了。请协助。谢谢。

单元代表

protocol MyCellDelegate {
func sendDataFromCell(_ sender: Any)
} 

PTLISTCELL

class PtlistCell: UITableViewCell {
@IBOutlet private weak var ptnameLbl: UILabel!
@IBOutlet private weak var assignedmdLbl: UILabel!
@IBOutlet private weak var officemdLbl: UILabel!
@IBOutlet private weak var roomnumberLbl: UILabel!
@IBOutlet private weak var seenoseeLbl: UILabel!
@IBOutlet private weak var assigneddateLbl: UILabel!
@IBOutlet weak var ptdataBtn: UIButton!
var ptdatainfoRef: CollectionReference!
var query: Query!
var patdata = [PTData]()
var delegate: MyCellDelegate?
override func awakeFromNib() {
    super.awakeFromNib()
    ptdatainfoRef = Firestore.firestore().collection(PTLIST_REF)
}
func configureCell(ptlist: PTList) {
    ptnameLbl.text = ptlist.ptname
    assignedmdLbl.text = ptlist.assignedmd
    officemdLbl.text = ptlist.officemd
    roomnumberLbl.text = ptlist.room
    seenoseeLbl.text = ptlist.seenosee
    assigneddateLbl.text = ptlist.assigneddate 
}
@IBAction func ptdataTapped(_ sender: Any) {
    let query = ptdatainfoRef.whereField("ptname", isEqualTo: 
(ptnameLbl.text!))
        .whereField("assignedmd", isEqualTo: (assignedmdLbl.text!))
        .whereField("officemd", isEqualTo: (officemdLbl.text!))
        .whereField("room", isEqualTo: (roomnumberLbl.text!))
        .whereField("seenosee", isEqualTo: (seenoseeLbl.text!))
        .whereField("assigneddate", isEqualTo: 
(assigneddateLbl.text!))
    query.getDocuments { (snapshot, error) in
        if let err = error {
            debugPrint("error getting data: (err)")
        } else {
            guard let snap = snapshot else { return }
            for document in snap.documents {
                let data = document.data()
                let ptname = data[PTNAME] as? String ?? ""
                let dob = data[DOB] as? String ?? ""
                let fin = data[FIN] as? String ?? ""
                let officemd = data[OFFICEMD] as? String ?? ""
                let assignedmd = data[ASSIGNEDMD] as? String ?? ""
                let assigneddate = data[ASSIGNEDDATE] as? String ?? ""
                let room = data[ROOM] as? String ?? ""
                let diagnoses = data[DIAGNOSES] as? String ?? ""
                let reasonforadmitorconsult = 
data[REASONFORADMITORCONSULT] as? String ?? ""
                let goalofhospitalization = 
data[GOALOFHOSPITALIZATION] as? String ?? ""
                let seenosee = data[SEENOSEE] as? String ?? ""
                let notestocbo = data[NOTESTOCBO] as? String ?? ""
                let comments = data[COMMENTS] as? String ?? ""
                let hosp = data[HOSP] as? String ?? ""
                let team = data[TEAM] as? String ?? ""
                let newPtdata = PTData (ptname: ptname, dob: dob, fin: 
fin, officemd: officemd, assignedmd: assignedmd, assigneddate: 
assigneddate, room: room, diagnoses: diagnoses, 
reasonforadmitorconsult: reasonforadmitorconsult, 
goalofhospitalization: goalofhospitalization, seenosee: seenosee, 
notestocbo: notestocbo, comments: comments, hosp: hosp, team: team)
                self.patdata.append(newPtdata)
                print(document.data())
            };print(self.delegate)
            if(self.delegate != nil) {
                self.delegate?.sendDataFromCell(sender)
            }
        }
    }
 }
}

结果数据VC

 class ResultsdataVC: UIViewController, UITableViewDataSource, 
 UITableViewDelegate {
 @IBOutlet weak var tableView: UITableView!
 var ptlist: PTList!
 var ptlists = [PTList]()
 var tableVc: PatdataVC!
 var ptdata: PTData!
 var patdata = [PTData]()
 override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self
}
func tableView(_ tableView: UITableView, numberOfRowsInSection 
section: Int) -> Int {
    return ptlists.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: 
IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: 
"PtlistCell", for: indexPath) as? PtlistCell {
        cell.configureCell(ptlist: ptlists[indexPath.row])
        return cell
    }
    return UITableViewCell()
 }
}
extension ResultsdataVC: MyCellDelegate {
func sendDataFromCell(_ sender: Any) {
    self.performSegue(withIdentifier: "gotoptdata", sender: Any?.self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "gotoptdata" {
         let vc = segue.destination as! PatdataVC
         vc.patdata = patdata
    }
}

}

patdataVC

class PatdataVC: UIViewController, UITableViewDelegate, 
UITableViewDataSource {

var ptdata: PTData!
var patdata = [PTData]()
var tableViewCellDelegate: MyCellDelegate?
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self
}
func tableView(_ tableView: UITableView, numberOfRowsInSection 
section: Int) -> Int {
    return patdata.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: 
IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: 
"PtdataCell", for: indexPath) as? PtdataCell {
        cell.configureCell(patdata: patdata[indexPath.row])
            return cell
 }
     return UITableViewCell()
}
}

帕特数据单元

class patdataCell: UITableViewCell {

@IBOutlet weak var ptnameLbl: UILabel!
@IBOutlet weak var dobLbl: UILabel!
@IBOutlet weak var finLbl: UILabel!
@IBOutlet weak var officemdLbl: UILabel!
@IBOutlet weak var assignedmdLbl: UILabel!
@IBOutlet weak var assigneddateLbl: UILabel!
@IBOutlet weak var roomLbl: UILabel!
@IBOutlet weak var diagnosesLbl: UILabel!
@IBOutlet weak var reasonforadmitorconsultLbl: UILabel!
@IBOutlet weak var seenoseeLbl: UILabel!
@IBOutlet weak var goalofhospLbl: UILabel!
@IBOutlet weak var notestocboLbl: UILabel!
@IBOutlet weak var commentsLbl: UILabel!
var ptdata: PTData!
override func awakeFromNib() {
    super.awakeFromNib()
}
func configureCell(ptdata: PTData) {
    ptnameLbl.text = ptdata.ptname
    dobLbl.text = ptdata.dob
    finLbl.text = ptdata.fin
    officemdLbl.text = ptdata.officemd
    officemdLbl.text = ptdata.officemd
    assignedmdLbl.text = ptdata.assignedmd
    roomLbl.text = ptdata.room
    diagnosesLbl.text = ptdata.diagnoses
    reasonforadmitorconsultLbl.text = ptdata.reasonforadmitorconsult
    seenoseeLbl.text = ptdata.seenosee
    goalofhospLbl.text = ptdata.goalofhosp
    notestocboLbl.text = ptdata.notestocbo
    commentsLbl.text = ptdata.comments
}
}

segue 只能从 vc 实例触发,而不能从 tableCell 实例触发

 self.performSegue(withIdentifier: "gotoptdata",sender: self)

为此,这应该存在于VC内部

 func prepare(for segue: UIStoryboardSegue, sender: AnyObject!) {
            if segue.identifier == "gotoptdata" {
                let button = sender as! UIButton
                let view = button.superview!
                let cell = view.superview as! patdataCell
                let indexPath = PTData.ptdata()
            }
}

如果您需要从单元格按钮操作触发 segue,则需要创建一个委托

class ptlistCell: UITableViewCell {
   weak var delegate:VCName?
   ....
} 

并将其分配到 VC 的cellForRowAt

let cell = ///
cell.delegate = self

现在在单元格内你可以做

delegate?.performSegue...............

在这里,您可以发送self sender这是单元格本身

self.performSegue(withIdentifier: "gotoptdata",sender: self)

所以你不能把它投射到这里的按钮

let button = sender as! UIButton

最新更新