tableView didSelectRowAt indexPath 在视图第一次加载时没有触发,第二次效果很好



我在View Controller有一个tableViewdelegatedatasource通过IB连接起来的。我正在使用tableView进行多项选择。在我的didSelectRowAt IndexPath中,选择允许用户标记两个核心数据实体之间的关系:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
let wageClassObject = self.wageClasses[indexPath.row]
let wageClassStatus = wageClassObject.value(forKey: "checked") as? Bool
wageClassObject.setValue(!wageClassStatus!, forKey:"checked")
if (wageClassStatus)! {
proposalToEdit?.addToWageClasses(wageClassObject)    
}
else {
proposalToEdit?.removeFromWageClasses(wageClassObject)    
}    
}

当用户首次加载视图时,选择行不起作用。当用户第二次加载视图时,添加和删除功能效果很好。

我已经尝试了此线程中建议的所有解决方案,但没有骰子。我也找不到像我的情况,问题是它在第一次加载视图时不起作用。

非常感谢建议!

编辑添加:viewDidLoad和核心数据代码

override func viewDidLoad() {
loadProposalData()
tableView.reloadData()
super.viewDidLoad()
proposalNameField.delegate = self
pensionField.delegate = self
percentField.delegate = self
if let topItem = self.navigationController?.navigationBar.topItem {
topItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
}
if  wageClasses != nil {
getWageClasses()
print("(wageClasses)")
}

}
func getWageClasses(){
let fetchRequest: NSFetchRequest<WageClass> = WageClass.fetchRequest()
do {
try self.wageClasses = context.fetch(fetchRequest)
} catch {
// handle error
}
}

@IBAction func calculateButtonTapped(_ sender: UIButton) {
var proposal: Proposal!
if proposalToEdit == nil {
proposal = Proposal(context: context)
} else {
proposal = proposalToEdit
}

proposal.dateCreated = currentDateTime as NSDate?

if let proposalName = proposalNameField.text {
proposal.proposalName = proposalName
}
if let pensionContribution = pensionField.text {
proposal.pensionContribution = (pensionContribution as NSString).doubleValue
}
if let percentIncrease = percentField.text {
proposal.percentIncrease = (percentIncrease as NSString).doubleValue
}

/// if let setting the checked value?


adD.saveContext()
_ = navigationController?.popViewController(animated: true)
}

我没有使用viewDidAppear.

关于核心数据的更多信息。我有两个实体,提案和工资类。两者之间都有对多关系。在此视图控制器上,用户可以通过三个文本字段(姓名、百分比增加、养老金金额)编辑提案,然后从表视图中选择相关的工资类。

我希望用户能够在第一次单击上一个视图控制器导航栏中的"添加"按钮时输入建议字段并选择相关的 wageClasses。发生的情况是,用户单击添加,将数据输入到文本字段,选择工资等级,然后点击计算。文本字段保存,标签使用编程的计算进行更新,但 wageClasses 数据保持为零。如果用户再次选择提案(这就是我所说的在上面第二次加载视图的意思),那么用户可以添加 wageClasses 并且所有计算都正确运行。但不是在第二次打开视图之前。

视图的屏幕截图

您的代码使用proposalToEdit实例变量:

if (wageClassStatus)! {
proposalToEdit?.addToWageClasses(wageClassObject)    
}
else {
proposalToEdit?.removeFromWageClasses(wageClassObject)    
}  

这里基本上nil,必须在调用此函数之前对其进行初始化,从而使此调用不执行(无法在 nil 对象上完成)。您第一次将其插入上下文中calculateButtonTapped

if proposalToEdit == nil {
proposal = Proposal(context: context)
}

如果您希望它第一次工作(即在第一次单击"计算"之前),请在viewDidLoad中的某处添加上述代码,如下所示:

override func viewDidLoad() {
loadProposalData()
if proposalToEdit == nil {
proposal = Proposal(context: context)
}

如果上述不起作用,我建议您添加一个指向存储库的链接以帮助调试此代码,我在这里找不到更多缺陷,但是添加和删除实现以及核心数据堆栈如何工作没有详细信息。

如果有人遇到同样的问题,关键是在将relationship添加到另一个object之前创建core data object。上面的代码不起作用,因为我试图向尚不存在的对象添加关系。

我的解决方案是将操作分成两个view controllers但我很想知道更多关于如何在一个view controller中实现这一点的信息。

相关内容

最新更新