如何在点击按钮时将 Tableview 单元格内的文本字段中的数据打印到控制台
How to Print data from textfield present inside Tableview cell to console on tapping button
我想打印来自 tableview 单元格内的文本字段的数据,以便在单击 tableview 外的按钮时进行控制。
当我使用按钮的 IBAction 方法打印数据时,我只获取单行数据。
这是我更新后的代码供参考。
//Deliverview cell
import UIKit
//Protocol
protocol Delivery {
func OnClick(index : Int)
}
class DeliveryViewCell: UITableViewCell {
@IBOutlet weak var cellTextField: UITextField!
@IBOutlet weak var button: UIButton!
@IBOutlet weak var cellImageView: UIImageView!
var celldelegate : Delivery?
var index : IndexPath?
var data: DeliveryData? {
didSet {
updateCell()
}
}
override func awakeFromNib() {
super.awakeFromNib()
cellTextField.borderStyle = .none
cellTextField.delegate = self
// Initialization code
}
func updateCell() {
if let data = data {
cellTextField.text = data.value
cellTextField.placeholder = data.placeholder
}
}
@IBAction func pickLocation(_ sender: Any) {
celldelegate?.OnClick(index: index!.row)
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
extension DeliveryViewCell: UITextFieldDelegate {
func textFieldDidEndEditing(_ cellTextField: UITextField) {
deliveryData1.value = cellTextField.text!
}
}
//View controller
class DeliveryData {
let placeholder: String
var value: String = ""
init(_ placeholder: String) {
self.placeholder = placeholder
}
}
var deliveryData1: [DeliveryData] = [
DeliveryData("Name"),
DeliveryData("Phone"),
DeliveryData("Email"),
DeliveryData("order"),
DeliveryData("Address"),
DeliveryData("Date"),
DeliveryData("Description"),
DeliveryData("Barcode"),
DeliveryData("Image")
]
根据您描述问题的方式,我相信您正在尝试打印与特定单元格关联的文本字段的值。您有多种方法可以实现。
方法一(最简单)
在这种情况下,对于初学者来说最简单的是以下内容。
更改您的 cellForRowAt 以执行以下操作:
let cell = deliveryTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DeliveryViewCell
cell.cellTextField.placeholder = deliveryData[indexPath.row]
//button refers to the button Outlet you have or should create.
cell.button.tag = indexPath.row
return cell
然后将按钮的操作更改为:
@IBAction func tapSaveData(_ sender: UIButton) {
let row = sender.tag //The tag you saved when dequeuing the cell
let cell1 = deliveryTableView.cellForRow(at: IndexPath.init(row: row, section: 0)) as! DeliveryViewCell
print(cell1.cellTextField.text!)
}
方法二
您可以简单地在单元格内使用闭包。
所以假设这是您的自定义单元格的一部分:
... your code
var onTextFieldEndEditing: ((String?) -> Void)?
func textFieldDidEndEditing(_ textField: UITextField) {
//when editing is done.
onTextFieldEndEditing?(textField.text)
}
然后,在你的 cellForRowAt:
let cell = deliveryTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DeliveryViewCell
cell.cellTextField.placeholder = deliveryData[indexPath.row]
cell.onTextFieldEndEditing = { [weak self] text in
print(text)
}
return cell
在方法 2 中,您不再需要按钮的 @IBAction 或按钮本身。
如果您仍然希望在点击按钮时调用打印,您可以简单地在单元格本身内创建一个 @IBAction ,然后在点击按钮而不是文本字段结束编辑时调用闭包。
如果您还有其他问题,请告诉我。
UITableViewCell
s 并不意味着存储状态。当您滚动时,单元格将被重新使用,并且它们可能具有的任何值(即用户输入的文本)都将丢失。
此问题的解决方案是保存用户对数据模型所做的任何更改。这可以是 class、数组、字典等。在您的情况下,DeliveryViewCell
需要符合 UITextFieldDelegate
以便在用户完成编辑时收到通知:
extension DeliveryViewCell: UITextFieldDelegate {
func textFieldDidEndEditing(_ textField: UITextField) {
//Do something here to save the text...
}
}
然后只需将更新后的文本存储在某处即可。这是一种选择,尽管绝不是唯一甚至最好的方法:
//In your cell
var data: DeliveryData? {
didSet {
updateCell()
}
}
override func awakeFromNib() {
super.awakeFromNib()
textField.delegate = self
}
func updateCell() {
if let data = data {
textField.text = data.value
textField.placeholder = data.placeholder
}
}
extension DeliveryViewCell: UITextFieldDelegate {
func textFieldDidEndEditing(_ textField: UITextField) {
deliveryData?.value = textField.text!
}
}
//In your view controller
class DeliveryData {
let placeholder: String
var value: String = ""
init(_ placeholder: String) {
self.placeholder = placeholder
}
}
var deliveryData: [DeliveryData] = [
DeliveryData("Name"),
DeliveryData("Phone"),
DeliveryData("Email"),
DeliveryData("order"),
DeliveryData("Address"),
DeliveryData("Date"),
DeliveryData("Description"),
DeliveryData("Barcode"),
DeliveryData("Image")
]
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = deliveryTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DeliveryViewCell
cell.data = deliveryData[indexPath.row]
return cell
}
@IBAction func tapSaveData(_ sender: Any) {
for data in deliveryData {
print(data.value)
}
}
这还有一个额外的好处,即在单元格滚动回视图时恢复用户键入的任何文本。
我想打印来自 tableview 单元格内的文本字段的数据,以便在单击 tableview 外的按钮时进行控制。 当我使用按钮的 IBAction 方法打印数据时,我只获取单行数据。 这是我更新后的代码供参考。
//Deliverview cell
import UIKit
//Protocol
protocol Delivery {
func OnClick(index : Int)
}
class DeliveryViewCell: UITableViewCell {
@IBOutlet weak var cellTextField: UITextField!
@IBOutlet weak var button: UIButton!
@IBOutlet weak var cellImageView: UIImageView!
var celldelegate : Delivery?
var index : IndexPath?
var data: DeliveryData? {
didSet {
updateCell()
}
}
override func awakeFromNib() {
super.awakeFromNib()
cellTextField.borderStyle = .none
cellTextField.delegate = self
// Initialization code
}
func updateCell() {
if let data = data {
cellTextField.text = data.value
cellTextField.placeholder = data.placeholder
}
}
@IBAction func pickLocation(_ sender: Any) {
celldelegate?.OnClick(index: index!.row)
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
extension DeliveryViewCell: UITextFieldDelegate {
func textFieldDidEndEditing(_ cellTextField: UITextField) {
deliveryData1.value = cellTextField.text!
}
}
//View controller
class DeliveryData {
let placeholder: String
var value: String = ""
init(_ placeholder: String) {
self.placeholder = placeholder
}
}
var deliveryData1: [DeliveryData] = [
DeliveryData("Name"),
DeliveryData("Phone"),
DeliveryData("Email"),
DeliveryData("order"),
DeliveryData("Address"),
DeliveryData("Date"),
DeliveryData("Description"),
DeliveryData("Barcode"),
DeliveryData("Image")
]
根据您描述问题的方式,我相信您正在尝试打印与特定单元格关联的文本字段的值。您有多种方法可以实现。
方法一(最简单)
在这种情况下,对于初学者来说最简单的是以下内容。 更改您的 cellForRowAt 以执行以下操作:
let cell = deliveryTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DeliveryViewCell
cell.cellTextField.placeholder = deliveryData[indexPath.row]
//button refers to the button Outlet you have or should create.
cell.button.tag = indexPath.row
return cell
然后将按钮的操作更改为:
@IBAction func tapSaveData(_ sender: UIButton) {
let row = sender.tag //The tag you saved when dequeuing the cell
let cell1 = deliveryTableView.cellForRow(at: IndexPath.init(row: row, section: 0)) as! DeliveryViewCell
print(cell1.cellTextField.text!)
}
方法二
您可以简单地在单元格内使用闭包。
所以假设这是您的自定义单元格的一部分:
... your code
var onTextFieldEndEditing: ((String?) -> Void)?
func textFieldDidEndEditing(_ textField: UITextField) {
//when editing is done.
onTextFieldEndEditing?(textField.text)
}
然后,在你的 cellForRowAt:
let cell = deliveryTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DeliveryViewCell
cell.cellTextField.placeholder = deliveryData[indexPath.row]
cell.onTextFieldEndEditing = { [weak self] text in
print(text)
}
return cell
在方法 2 中,您不再需要按钮的 @IBAction 或按钮本身。 如果您仍然希望在点击按钮时调用打印,您可以简单地在单元格本身内创建一个 @IBAction ,然后在点击按钮而不是文本字段结束编辑时调用闭包。 如果您还有其他问题,请告诉我。
UITableViewCell
s 并不意味着存储状态。当您滚动时,单元格将被重新使用,并且它们可能具有的任何值(即用户输入的文本)都将丢失。
此问题的解决方案是保存用户对数据模型所做的任何更改。这可以是 class、数组、字典等。在您的情况下,DeliveryViewCell
需要符合 UITextFieldDelegate
以便在用户完成编辑时收到通知:
extension DeliveryViewCell: UITextFieldDelegate {
func textFieldDidEndEditing(_ textField: UITextField) {
//Do something here to save the text...
}
}
然后只需将更新后的文本存储在某处即可。这是一种选择,尽管绝不是唯一甚至最好的方法:
//In your cell
var data: DeliveryData? {
didSet {
updateCell()
}
}
override func awakeFromNib() {
super.awakeFromNib()
textField.delegate = self
}
func updateCell() {
if let data = data {
textField.text = data.value
textField.placeholder = data.placeholder
}
}
extension DeliveryViewCell: UITextFieldDelegate {
func textFieldDidEndEditing(_ textField: UITextField) {
deliveryData?.value = textField.text!
}
}
//In your view controller
class DeliveryData {
let placeholder: String
var value: String = ""
init(_ placeholder: String) {
self.placeholder = placeholder
}
}
var deliveryData: [DeliveryData] = [
DeliveryData("Name"),
DeliveryData("Phone"),
DeliveryData("Email"),
DeliveryData("order"),
DeliveryData("Address"),
DeliveryData("Date"),
DeliveryData("Description"),
DeliveryData("Barcode"),
DeliveryData("Image")
]
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = deliveryTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DeliveryViewCell
cell.data = deliveryData[indexPath.row]
return cell
}
@IBAction func tapSaveData(_ sender: Any) {
for data in deliveryData {
print(data.value)
}
}
这还有一个额外的好处,即在单元格滚动回视图时恢复用户键入的任何文本。