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

时间:2017-04-13 15:01:18

标签: core-data swift3 tableview xcode8 multi-select

tableView View Controller delegate datasource tableViewdidSelectRowAt IndexPath通过IB连接。我正在使用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)
}

当用户第一次加载视图时,选择一行无效。当用户第二次加载视图时,添加和删除功能非常有效。

我已尝试在this thread中建议的所有解决方案,但没有骰子。我找不到一个与我相似的案例,问题是它在第一次加载时不起作用。

建议非常感谢!

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

<a href="#my-visual-composer-row-id" class="my-link">Click here to scroll down</a>

我没有使用my-visual-composer-row-id

关于核心数据的更多信息。我有两个实体,提案和wageClass。两者之间都有很多关系。在此viewController上,用户可以通过三个文本字段(名称,增加百分比,养老金金额)编辑提案,然后从tableView中选择相关的wageClasses。

我希望用户能够输入提案字段,并在他们第一次单击上一个viewController导航栏中的“添加”按钮时选择相关的salaryClasses。发生的事情是用户点击添加,将数据输入到文本字段,选择工资类,然后点击计算。文本字段保存,标签随编程计算更新,但wageClasses数据保持为零。如果用户再次选择提案(这就是我上面第二次加载视图的意思),那么用户可以添加wageClasses并正确运行所有计算。但不是在第二次开放之前。

screenshot of the view

2 个答案:

答案 0 :(得分:0)

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

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

这里基本上是nil,必须在调用此函数之前初始化,从而使这些调用不被执行(不能在nil对象上完成)。您可以在calculateButtonTapped

中首次将其插入上下文
if proposalToEdit == nil {
    proposal = Proposal(context: context)
}

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

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

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

答案 1 :(得分:0)

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

我的解决方案是将操作分成两个view controllers,但我想更多地了解如何在一个view controller中实现这些操作。