所以我有UITableView
这个有{4} UITextField
的单元格,我想在点击按钮时获取它们的值。
此代码不会检索任何值。
@IBAction func printBtnAction(_ sender: Any) {
let cell = self.myTableView.dequeueReusableCell(withIdentifier: "manualAddC1") as! AddFriendC1Cell
let alias = cell.aliasTextField.text!
let primaryPhone = cell.primaryPhoneTextField.text!
let secondaryPhone = cell.seondaryPhoneTextField.text!
let email = cell.emailAddressTextField.text!
print("Alias: \(alias), Phone: \(primaryPhone), Phone2: \(secondaryPhone), Email: \(email)")
}
答案 0 :(得分:13)
我终于通过这个简单的解决方案找到了它。
@IBAction func saveBtnAction(_ sender: Any) {
let index = IndexPath(row: 0, section: 0)
let cell: AddFriendC1Cell = self.myTableView.cellForRow(at: index) as! AddFriendC1Cell
self.alias = cell.aliasTextField.text!
self.primaryPhone = cell.primaryPhoneTextField.text!
self.secondaryPhone = cell.seondaryPhoneTextField.text!
self.email = cell.emailAddressTextField.text!
print("Alias: \(self.alias), Phone: \(self.primaryPhone), Phone2: \(self.secondaryPhone), Email: \(self.email)")
}
答案 1 :(得分:8)
行。按下按钮时,您将使tableViewCell出列。
let cell = self.myTableView.dequeueReusableCell(withIdentifier: "manualAddC1") as! AddFriendC1Cell
我相信您希望获得对现有tableViewCell的引用,如下所示:
if let cell = tableView.cellForRow(at: indexPath) as? AddFriendC1Cell {
// do what you need with cell
}
即使这样可行,我也不建议采用这种方法。如果用户使用像iPhone 4这样的小屏幕手机并且屏幕上看不到某些单元格会怎么样?我认为在这种情况下tableView.cellForRow
会为不可见的单元格返回nil
。
我建议在每个单元格中使用带有tableView的viewController委托的文本字段实现textField:shouldChange
。当在单元格中更改文本时,委托应该将更改传播到viewController,这会将值保存在实例变量中。
然后,当您按下按钮时,您只需从实例变量中获取值。
答案 2 :(得分:0)
我认为你的tableViewCells不是动态的。 您的单元格方法将如下所示。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellID") as! YourClass
cell.yourTextField.tag = indexPath.row
//
// Alias will be tag 0
// Primary Phone will be tag 1
// Secondary Phone will be tag 2
// Email Address will be tag 3, so on and so forth
// Then, attach to each delegate
//
cell.yourTextField.delegate = self
}
在UITableView处理类(符合UITextFieldDelegate协议)中,写下来。
func textField(_ textField: UITextField, shouldChangeCharactersIn range:NSRange, replacementString string: String) -> Bool {
let kActualText = (textField.text ?? "") + string
switch textField.tag
{
case 0:
aliasValueHolder = kActualText;
case 1:
primaryPhoneValueHolder = kActualText;
case 2:
secondaryPhoneValueHolder = kActualText;
case 3:
emailAddressValueHolder = kActualText;
default:
print("It is nothing");
}
return true;
}
然后你可以提交它。
答案 3 :(得分:0)
我认为,您应该在tableCell类中实现TextField委托方法,并在tableCell类中管理所有验证和输入文本。
现在,您将需要获取所有输入的值,为此,您必须在tableCell类中使用Protocol,并使用委托将输入的值发送给viewController以及带有标签的标签,以识别输入了哪个值,例如电话号码或电子邮件。
使用这种方式,您的代码将被简化和结构化。
快乐编码!
答案 4 :(得分:0)
//第一步
在UITableViewCell中
import UIKit
@objc protocol TableViewDelegate: NSObjectProtocol{
func afterClickingReturnInTextField(cell: ThirdTableCell)
}
class TableViewCell: UITableViewCell, UITextFieldDelegate {
@IBOutlet weak var enterTextField: UITextField!
weak var tableViewDelegate: TableViewDelegate?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
enterTextField.delegate = self
}
// @IBAction Of UITextfiled
@IBAction func tapHerre(_ sender: UITextField) {
tableViewDelegate?.responds(to: #selector(TableViewDelegate.afterClickingReturnInTextField(cell:)))
tableViewDelegate?.afterClickingReturnInTextField(cell: self)
}
// UITextField Defaults delegates
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
enterTextField.resignFirstResponder()
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
enterTextField = textField
}
}
//第二步
在UITableViewCell中
extension ViewController: UITableViewDelegate, UITableViewDataSource, TableViewDelegate {
var valueToPass : String?
func afterClickingReturnInTextField(cell: ThirdTableCell) {
valueToPass = cell.enterTextField.text
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return youArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableview.dequeueReusableCell(withIdentifier: "TableViewCell") as! TableViewCell
cell.enterTextField.text = youArray[indexPath.row]
cell.tableViewDelegate = (self as TableViewDelegate)
return cell
}
}
键盘消失后,您可以在valueToPass
中找到TextField值
答案 5 :(得分:-1)
func textField(_ textField: UITextField, shouldChangeCharactersIn range:NSRange, replacementString string: String) -> Bool {
// let kActualText = (textField.text ?? "") + string
var kActualText = (textField.text! as NSString).replacingCharacters(in: range, with: string)
kActualText = kActualText.trimmingCharacters(in: .whitespaces)
if textField.tag == 0
{
email_address = kActualText;
}
else if textField.tag == 3
{
password = kActualText;
}
else
{
print("It is nothing")
}
return true;
}