【问题标题】:UITableViewCell segue to another UITableViewCell does not run - the delegate is NILUITableViewCell segue 到另一个 UITableViewCell 不运行 - 委托是 NIL
【发布时间】:2019-06-16 21:07:23
【问题描述】:

问题已解决。查看帖子 CustomCell label in ViewController not displaying data

我有一个带有 IBAction 按钮的 UITableViewCell,它调用 查询 Firestore。查询运行后,我想转到另一个 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()
}
}

PATDATACELL

类 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

}

}

【问题讨论】:

    标签: swift uitableview google-cloud-firestore


    【解决方案1】:

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

     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...............
    

    这里有一个单独的提示,您可以在 sender 中发送 self,这是单元格本身

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

    所以你不能在这里把它转换成按钮

    let button = sender as! UIButton
    

    【讨论】:

    • 进行更改后,我收到以下错误:'ptlistCell 0x7fe0c492a600> setValue:forUndefinedKey:]:此类不符合密钥委托的密钥值编码。编译器中没有错误。我编辑我的代码以反映更新。
    • 在 **class ptlistCell: UITableViewCell ** 中创建委托后,但是当我在 vc 中分配它时,编译器错误提示“'UITableViewCell' 类型的值没有成员'委托'。我不能在两者上声明代表。我真的很困惑。我一直在网上搜索,但找不到任何东西。您还有其他建议吗?谢谢!
    • 投它let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as! ptlistCell ; cell.delegate = self
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多