自定义UITableViewCell中的UITextField意外发现为零
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义UITableViewCell中的UITextField意外发现为零相关的知识,希望对你有一定的参考价值。
我有一个TableView
与自定义单元格内部有TextField
,不幸的是我得到一个线程1:致命错误:当我使用它时解开一个可选值时意外发现nil(按返回或触摸textField外面的屏幕以退出占位符)。
这是我的代码:
class WalletTableViewController: UIViewController, UITextFieldDelegate {
var cryptosArray: [Cryptos] = []
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
loadCryptoArray()
}
func loadCryptoArray() {
if UserDefaults.standard.object(forKey: "cryptosArray") != nil {
if let decoded = UserDefaults.standard.object(forKey: "cryptosArray") as? Data? {
let decodedCryptoArray = NSKeyedUnarchiver.unarchiveObject(with: decoded!) as! [Cryptos]
cryptosArray = decodedCryptoArray
}
}
}
}
TableView
扩展:
extension WalletTableViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cryptosArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let crypto = cryptosArray[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! WalletTableViewCell
cell.setCrypto(crypto: crypto)
cell.delegate = self
cell.amountTextField.delegate = self
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 85
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
cryptosArray.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
let userDefaults = UserDefaults.standard
let encodedData : Data = NSKeyedArchiver.archivedData(withRootObject: cryptosArray)
userDefaults.set(encodedData, forKey: "cryptosArray")
userDefaults.synchronize()
}
}
}
这是TextField
的委托函数:
extension WalletTableViewController: CryptoCellDelegate {
func cellAmountEntered(_ sender: Any) {
if WalletTableViewCell().amountTextField.text == "" {
return
}
let str = WalletTableViewCell().amountTextField.text
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US")
let dNumber = formatter.number(from: str!)
let nDouble = dNumber!
let eNumber = Double(truncating: nDouble)
WalletTableViewCell().amountLabel.text = String(format:"%.8f", eNumber)
UserDefaults.standard.set(WalletTableViewCell().amountLabel.text, forKey: "bitcoinAmount")
WalletTableViewCell().amountTextField.text = ""
}
}
自定义单元格文件:
protocol CryptoCellDelegate {
func cellAmountEntered(_ sender: Any)
}
class WalletTableViewCell: UITableViewCell {
@IBOutlet weak var cryptoNameLabel: UILabel!
@IBOutlet weak var amountLabel: UILabel!
@IBOutlet weak var amountTextField: UITextField!
var cryptoItem: Crypto!
var delegate: CryptoCellDelegate?
func setCrypto(crypto: Cryptos) {
cryptoNameLabel.text = crypto.name
}
@IBAction func amountTextFieldEntered(_ sender: Any) {
delegate?.cellAmountEntered((Any).self)
}
}
TableView
拥有与用户想要的一样多的单元格,因此这取决于创建单元格的对象的array
。
我想我某处有delegate
问题?我对UITableView
很新,所以这是一个相当大的挑战,请原谅任何愚蠢的错误:)
PS:我试图通过删除keyboard
函数和不相关的东西来保持代码简短,请告诉我你是否需要别的东西。
无论你在哪里使用WalletTableViewCell()
,你都会创建一个新的WalletTableViewCell
实例。崩溃发生是因为你是以编程方式创建它,而WalletTableViewCell
是使用故事板设计的,并且由于你没有使用故事板实例化它,所以@IBOutlet
s尚未设置,因此是nil
。
更新
尝试使用它来修复它。将CryptoCellDelegate
更新为:
protocol CryptoCellDelegate {
func cellAmountEntered(_ walletTableViewCell: WalletTableViewCell)
}
然后在WalletTableViewCell
更新amountTextFieldEntered
:
@IBAction func amountTextFieldEntered(_ sender: Any) {
delegate?.cellAmountEntered(self)
}
最后更新委托实施:
extension WalletTableViewController: CryptoCellDelegate {
func cellAmountEntered(_ walletTableViewCell: WalletTableViewCell) {
// now you can use walletTableViewCell to access the cell that called the delegate method
if walletTableViewCell.amountTextField.text == "" {
return
}
let str = walletTableViewCell.amountTextField.text
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US")
let dNumber = formatter.number(from: str!)
let nDouble = dNumber!
let eNumber = Double(truncating: nDouble)
walletTableViewCell.amountLabel.text = String(format:"%.8f", eNumber)
UserDefaults.standard.set(walletTableViewCell.amountLabel.text, forKey: "bitcoinAmount")
walletTableViewCell.amountTextField.text = ""
}
}
以上是关于自定义UITableViewCell中的UITextField意外发现为零的主要内容,如果未能解决你的问题,请参考以下文章
自定义 UITableViewCell 中的 UIPickerView
自定义 UITableViewCell 中的 UIImageview 未正确显示
自定义 uitableviewcell 中的 Uibuttons