gpt4 book ai didi

ios - 从XIB导航到tableView时应用崩溃

转载 作者:行者123 更新时间:2023-11-28 07:21:14 26 4
gpt4 key购买 nike

我正在努力寻找答案,我想我会尽量在这里问。
我有一个应用程序在导航控制器中使用UITableView控制器。tableView有两个具有自定义类的单元格,这些单元格本身是在情节提要中创建的。
细胞只是有一个标签和一些小的视觉调整。
另外,在主页面上也有一种抽屉样式的可扩展TabLVIEW,它是作为XIB文件创建的。无论是主TabLVIEW还是XIB视图都会导致最后一个屏幕被按下,并使用单元格中显示的地址来显示最终的TabLVIEW中更详细的信息。
当我从UITableViewController导航到最终的UITableView时,一切都工作得很好,所有信息都很好地显示在单元格内,以及单元格内的标签。
现在,当我尝试从XIB导航到同一个最终TabelVIEW控制器时,会出现问题。
一开始,应用程序崩溃了,我得到一个错误,说我需要为标识符注册一个nib或一个类,或者在故事板中连接一个原型单元。
当我尝试注册nib时,由于意外异常“NSUnknownKeyException”,我将在终止应用程序时遇到以下错误,原因是:“[ setValue:forUndefinedKey:]:此类不符合密钥句柄的密钥值编码。”
看起来我输入了NeBNEX的错误密钥,但是我不确定除了XIB文件的名字之外还有什么输入。
编辑:
谢谢大家,手柄的错误是一个完全独立的小问题,我现在已经解决了,但主要问题仍然存在。
我在文章的底部添加了更多的解释和信息。
我还试着用 tableView.register(<cellClass: AnyClass?>, forCellReuseIdentifier: <String>)注册了这个手机
这解决了应用程序崩溃的问题,但现在tableView单元格似乎无法识别内部的标签。
我想当我注册手机的时候,我也需要让它知道里面的标签,但是还没有找到怎么做。
Without registering the cell
With cell registered
最终的tableViewController,它应该显示所有的细节,包括带有标记的detailLabel

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == 0 {

let cell = tableView.dequeueReusableCell(withIdentifier: "detailCell", for: indexPath)
cell.textLabel?.text = "\(walletData.rowTitles[indexPath.section])"

if let detailLabel = cell.viewWithTag(125) as? UILabel {

switch indexPath.section {
case 0:
detailLabel.text = walletData.address
case 1:
detailLabel.text = "\(walletData.totalMNs)"
case 2:
detailLabel.text = walletData.totalShares
case 3:
detailLabel.text = "\(walletData.tiers[0].masterNodes.count)"
case 4:
detailLabel.text = "\(walletData.tiers[1].masterNodes.count)"
case 5:
detailLabel.text = "\(walletData.tiers[2].masterNodes.count)"
case 6:
detailLabel.text = "\(walletData.tiers[3].masterNodes.count)"
default:
detailLabel.text = "Sumtin' done messed up!"
}
}
return cell
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: "mnCell", for: indexPath)
if let addressLabel = cell.viewWithTag(125) as? UILabel {
let masterNode = walletData.tiers[indexPath.section - 3].masterNodes[indexPath.row - 1]
addressLabel.text = masterNode.address
switch masterNode.state {
case 1:
addressLabel.textColor = #colorLiteral(red: 0.2196078449, green: 0.007843137719, blue: 0.8549019694, alpha: 1) // Initialize
case 2:
addressLabel.textColor = #colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1) // Deposited
case 3:
addressLabel.textColor = #colorLiteral(red: 0.2745098174, green: 0.4862745106, blue: 0.1411764771, alpha: 1) // Active
case 4:
addressLabel.textColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) // Terminate
default:
addressLabel.textColor = #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1) // Unknown
}
}

cell.textLabel?.text = walletData.tiers[indexPath.section - 3].masterNodes[indexPath.row - 1].shares
cell.textLabel?.alpha = 0.75
cell.backgroundColor = #colorLiteral(red: 0.921431005, green: 0.9214526415, blue: 0.9214410186, alpha: 1)
cell.textLabel?.font = UIFont(name: "Helvetica Neue", size: 14)

return cell
}
}

编辑:
谢谢大家的回答。当我测试不同的选项时,我有点打嗝,忘记了我在代码中有句柄出口,所以我没有意识到错误。但无论如何,这与我的应用程序在从XIB导航到最终UITable视图时崩溃的错误无关。
我添加了更多的图片,以便更好地了解到底发生了什么,以及应用程序中的导航是如何工作的。
在这里你可以看到主要故事板和一些片段。
Storyboard
当按下地址列表表视图控制器上的信息指示器时,这段代码将运行,用户将被带到您可以在右下角看到的详细表视图控制器。
override func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) {
if let selectedWallet = groupedWallets[indexPath.section].wallets[indexPath.row].address {
walletData?.fetchWalletData(address: selectedWallet)

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
if let detailTableViewController = self.storyboard?.instantiateViewController(withIdentifier: "detailTableViewController") as? DetailTableViewController {
detailTableViewController.walletData = self.walletData!
self.show(detailTableViewController, sender: self)
SVProgressHUD.dismiss()
}
}
}
}

在这里,您可以看到XIB文件,它本质上只是一个UITable视图,有一个小句柄用来打开它。
UITableView xib
这是XB UITababVIEW打开的应用程序的主页。
UITableView xib in running app
在这里,您将看到SavedListViewController的代码,该代码是XIB文件的所有者。
class SavedListViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

let defaults = UserDefaults.standard
let addressListVC = AddressListTableViewController()
var selectedWallet = ""
var savedWallets = [String]()
var walletData = WalletData()
let detailTableViewController = DetailTableViewController()

@IBOutlet var handleArea: UIView!
@IBOutlet var handle: UIImageView!
@IBOutlet var tableView: UITableView!


override func viewDidLoad() {
guard let walletList = defaults.object(forKey: "savedWallets") as? [String] else { return }
savedWallets = walletList

//tableView.register(UINib.init(nibName: "SavedListView", bundle: nil), forCellReuseIdentifier: "detailCell")
//tableView.register(UINib.init(nibName: "SavedListView", bundle: nil), forCellReuseIdentifier: "mnCell")

view.layer.cornerRadius = 12
handle.layer.cornerRadius = 6
handleArea.backgroundColor = #colorLiteral(red: 0.921431005, green: 0.9214526415, blue: 0.9214410186, alpha: 1)
handleArea.alpha = 0.90
handle.alpha = 0.90
view.backgroundColor = .clear
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return savedWallets.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "defaultCell")
let cell = tableView.dequeueReusableCell(withIdentifier: "defaultCell", for: indexPath)
if savedWallets.isEmpty {
cell.textLabel?.text = "No addresses saved yet"
} else {
cell.textLabel?.text = savedWallets[indexPath.row]
}
return cell
}


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedWallet = savedWallets[indexPath.row]
walletData.fetchWalletData(address: selectedWallet)
detailTableViewController.walletData = walletData
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.show(self.detailTableViewController, sender: self)
SVProgressHUD.dismiss()
}
}
}

所以,要澄清的是,在XIB文件中创建的UITableView显示得很好。这是我打开应用程序时看到的第一件事,所有的东西都在正确的位置并且工作正常。
崩溃发生在我点击单元格并调用didSelectRowAt方法时。
方法本身就是这样
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedWallet = savedWallets[indexPath.row]
walletData.fetchWalletData(address: selectedWallet)
detailTableViewController.walletData = walletData
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.show(self.detailTableViewController, sender: self)
SVProgressHUD.dismiss()
}
}

该方法现在显示了detailTableViewController,它也是故事板图像的右下角。
视图显示出来,但一旦 let cell = tableView.dequeueReusableCell(withIdentifier: "detailCell", for: indexPath)行被调用,它就会崩溃。
真正让我困惑的是,当我通过点击*地址列表表视图控制器**中的行来访问同一个VC时,一切都正常。
但是,当我在SavedListViewController中点击该行时,由于未捕获的异常“NSInternalInconsistencyException”而导致终止应用程序时出错,原因是:“无法将标识符为detailCell的单元格出列-必须为该标识符注册nib或类,或者连接序列图像板中的原型单元格”

最佳答案

你有没有可能把插座接错了?在具有UITabelVIEW单元格的XIB中,必须从类的名称连接出口,而不是从文件所有者连接:
保持文件所有者的出口畅通:
Notice the outlets
将插座连接到班级:
Outlets connected to the class name

关于ios - 从XIB导航到tableView时应用崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57973302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com