将变量从 customCell.xib 的按钮传递到另一个 UIViewController
Passing a variable from a customCell.xib's button to another UIViewController
我的自定义单元格有一个按钮,单击该按钮后,用户可以转到另一个 ViewControler。该按钮有一个带有用户 ID 字符串的 titleLabel。我想要做的是将用户带到一个新的 UIViewController,将点击按钮的 titleLabel(用户 ID)传递给新视图控制器上的一个变量。这样,我可以使用该变量(用户 ID)从 firebase 获取更多信息并将其显示在 UI 视图控制器上。
在自定义单元格的 .xib 上,我打印了 UID 以确保每个按钮都打印有对应的 ID,它确实如此。我想不出将该 ID 传递给新的 ViewController.
的方法
我试着在线研究,发现你不能在 customCell.xib.
上做 prepare(for segue) 或 performsegue(WithIdentifier)
我试过委托和协议,但仍然无法正常工作。我是 Swift 的新手。任何帮助都会很棒,谢谢!
这是 customCell.Xib 的 Swift 文件:
class CustomCellTableViewCell: UITableViewCell {
@IBOutlet weak var postImage: UIImageView!
@IBOutlet weak var nameLbl: UILabel!
@IBOutlet weak var descriptionLbl: UITextView!
@IBOutlet weak var profileImageBtn: UIButton!
@IBOutlet weak var profileImage: UIImageView!
@IBOutlet weak var view: UIView!
var btnSelected : Bool = false
var vcInstance: ProfilesTableVC?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
view.clipsToBounds = true
view.layer.cornerRadius = view.frame.size.width / 2
profileImage.layer.cornerRadius = profileImage.frame.size.width / 2
descriptionLbl.alpha = 0.7
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
@IBAction func profileBtnPressed(_ sender: Any) {
let passValue = UserProfileVC()
let profileTvC = ProfilesTableVC()
print (profileImageBtn.titleLabel!.text!)
var id = (profileImageBtn.titleLabel!.text!)
profileTvC.didSelectProfileBtn(senderID: id)
}
这是 tableViewController,我在这里加载所有内容(而不是我想传递值的地方)。我尝试在此处传递值,然后执行 prepareForSegue 以将值传递给新的 UIViewController 但在 segue 发生后该值变为 nil。我只是包括 .xib 从 table 视图调用函数的代码。
class ProfilesTableVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate,UINavigationControllerDelegate, UIImagePickerControllerDelegate{
let cell = CustomCellTableViewCell()
func didSelectProfileBtn(senderID: String) {
senderIDArray.append(senderID)
var index = senderIDArray.count - 1
selectedCellUserID = senderIDArray[index]
performSegue(withIdentifier: "showSendersProfile", sender: Any?.self)
}
这是 UIViewController,我想在其中传递变量并使用该 ID 显示来自 Firebase 的更多信息
import UIKit
import Firebase
class UserProfileVC: UIViewController {
let customCell = CustomCellTableViewCell()
let profileTvC = ProfilesTableVC()
@IBOutlet weak var profileImage: UIImageView!
@IBOutlet weak var nameLbl: UILabel!
var delegate : Any?
var getName = String()
var getsenderID = String()
let userDataRef = Database.database().reference().child("Users")
override func viewDidLoad() {
super.viewDidLoad()
print("ID is: \(profileTvC.selectedCellUserID)")
let sender = getsenderID
print(sender)
}
}
您似乎创建了一个 NEW ProfilesTableVC
,并尝试执行转接。新创建的不在您的视图堆栈中,也不在您的情节提要中。
你可以在返回时添加这个 cellForRowAt
(当然是在 ProfilesTableVC
):
cell.vcInstance = self
然后在按钮中点击
@IBAction func profileBtnPressed(_ sender: Any) {
print (profileImageBtn.titleLabel!.text!)
var id = (profileImageBtn.titleLabel!.text!)
vcInstance?.didSelectProfileBtn(senderID: id)
}
您可以使用 protocols/delegates 来完成。我想你试过了,但你的试用有问题。
定义回调委托:
protocol CustomCellDelegate: AnyObject {
func customCell(didSelectButton name: String)
}
您会注意到扩展 AnyObject
。这是允许weak
引用,尝试阅读Swift ARC
然后,在您的手机中:
weak var delegate: CustomCellDelegate?
然后在配置文件中BtnPressed(_ sender: Any)
@IBAction func profileBtnPressed(_ sender: Any) {
var id = (profileImageBtn.titleLabel!.text!)
delegate?.customCell(didSelectButton: id)
}
单元格出列时:
(cell as? CustomCellTableViewCell)?.delegate = self
如果您不想使用协议,您可以在 tableView - cellForRowAt 方法中将目标添加到按钮,同样在该方法中,您将标签设置为行索引值。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let profileCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as! MoviewReviewCell
reviewCell.profileImageBtn.tag = indexPath.row
reviewCell.profileImageBtn.addTarget(self, action: #selector(tappedOnXibCellButton), for: .touchUpInside)
return reviewCell
}
@objc func tappedOnXibCellButton(sender: UIButton) {
print(sender.tag)
performSegue(withIdentifier: reviewListToDetails, sender: sender.tag)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let identifier = segue.identifier
if identifier == "segueName" {
let destViewController = segue.destination as! DestinationClassViewController
let selectedIndex = sender as! Int
let profileId = profilesList[selectedIndex].id
destViewController.profileId = profileId
}
}
我的自定义单元格有一个按钮,单击该按钮后,用户可以转到另一个 ViewControler。该按钮有一个带有用户 ID 字符串的 titleLabel。我想要做的是将用户带到一个新的 UIViewController,将点击按钮的 titleLabel(用户 ID)传递给新视图控制器上的一个变量。这样,我可以使用该变量(用户 ID)从 firebase 获取更多信息并将其显示在 UI 视图控制器上。
在自定义单元格的 .xib 上,我打印了 UID 以确保每个按钮都打印有对应的 ID,它确实如此。我想不出将该 ID 传递给新的 ViewController.
的方法我试着在线研究,发现你不能在 customCell.xib.
上做 prepare(for segue) 或 performsegue(WithIdentifier)我试过委托和协议,但仍然无法正常工作。我是 Swift 的新手。任何帮助都会很棒,谢谢!
这是 customCell.Xib 的 Swift 文件:
class CustomCellTableViewCell: UITableViewCell {
@IBOutlet weak var postImage: UIImageView!
@IBOutlet weak var nameLbl: UILabel!
@IBOutlet weak var descriptionLbl: UITextView!
@IBOutlet weak var profileImageBtn: UIButton!
@IBOutlet weak var profileImage: UIImageView!
@IBOutlet weak var view: UIView!
var btnSelected : Bool = false
var vcInstance: ProfilesTableVC?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
view.clipsToBounds = true
view.layer.cornerRadius = view.frame.size.width / 2
profileImage.layer.cornerRadius = profileImage.frame.size.width / 2
descriptionLbl.alpha = 0.7
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
@IBAction func profileBtnPressed(_ sender: Any) {
let passValue = UserProfileVC()
let profileTvC = ProfilesTableVC()
print (profileImageBtn.titleLabel!.text!)
var id = (profileImageBtn.titleLabel!.text!)
profileTvC.didSelectProfileBtn(senderID: id)
}
这是 tableViewController,我在这里加载所有内容(而不是我想传递值的地方)。我尝试在此处传递值,然后执行 prepareForSegue 以将值传递给新的 UIViewController 但在 segue 发生后该值变为 nil。我只是包括 .xib 从 table 视图调用函数的代码。
class ProfilesTableVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate,UINavigationControllerDelegate, UIImagePickerControllerDelegate{
let cell = CustomCellTableViewCell()
func didSelectProfileBtn(senderID: String) {
senderIDArray.append(senderID)
var index = senderIDArray.count - 1
selectedCellUserID = senderIDArray[index]
performSegue(withIdentifier: "showSendersProfile", sender: Any?.self)
}
这是 UIViewController,我想在其中传递变量并使用该 ID 显示来自 Firebase 的更多信息
import UIKit
import Firebase
class UserProfileVC: UIViewController {
let customCell = CustomCellTableViewCell()
let profileTvC = ProfilesTableVC()
@IBOutlet weak var profileImage: UIImageView!
@IBOutlet weak var nameLbl: UILabel!
var delegate : Any?
var getName = String()
var getsenderID = String()
let userDataRef = Database.database().reference().child("Users")
override func viewDidLoad() {
super.viewDidLoad()
print("ID is: \(profileTvC.selectedCellUserID)")
let sender = getsenderID
print(sender)
}
}
您似乎创建了一个 NEW ProfilesTableVC
,并尝试执行转接。新创建的不在您的视图堆栈中,也不在您的情节提要中。
你可以在返回时添加这个 cellForRowAt
(当然是在 ProfilesTableVC
):
cell.vcInstance = self
然后在按钮中点击
@IBAction func profileBtnPressed(_ sender: Any) {
print (profileImageBtn.titleLabel!.text!)
var id = (profileImageBtn.titleLabel!.text!)
vcInstance?.didSelectProfileBtn(senderID: id)
}
您可以使用 protocols/delegates 来完成。我想你试过了,但你的试用有问题。
定义回调委托:
protocol CustomCellDelegate: AnyObject {
func customCell(didSelectButton name: String)
}
您会注意到扩展 AnyObject
。这是允许weak
引用,尝试阅读Swift ARC
然后,在您的手机中:
weak var delegate: CustomCellDelegate?
然后在配置文件中BtnPressed(_ sender: Any)
@IBAction func profileBtnPressed(_ sender: Any) {
var id = (profileImageBtn.titleLabel!.text!)
delegate?.customCell(didSelectButton: id)
}
单元格出列时:
(cell as? CustomCellTableViewCell)?.delegate = self
如果您不想使用协议,您可以在 tableView - cellForRowAt 方法中将目标添加到按钮,同样在该方法中,您将标签设置为行索引值。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let profileCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as! MoviewReviewCell
reviewCell.profileImageBtn.tag = indexPath.row
reviewCell.profileImageBtn.addTarget(self, action: #selector(tappedOnXibCellButton), for: .touchUpInside)
return reviewCell
}
@objc func tappedOnXibCellButton(sender: UIButton) {
print(sender.tag)
performSegue(withIdentifier: reviewListToDetails, sender: sender.tag)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let identifier = segue.identifier
if identifier == "segueName" {
let destViewController = segue.destination as! DestinationClassViewController
let selectedIndex = sender as! Int
let profileId = profilesList[selectedIndex].id
destViewController.profileId = profileId
}
}