2017-04-13 51 views
0

我有一个tableViewView Controllerdelegatedatasource通过IB连线。我正在使用tableView进行多项选择。在我didSelectRowAt IndexPath,选择让用户标记两个核心数据实体之间的关系:当用户加载视图中的第一时间,选择行没有任何影响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)  
     }  
    } 

。当用户第二次加载视图时,添加和删除功能很好。

我试过this thread中提出的每个解决方案,但没有骰子。我无法找到与我的情况非常相似的情况,但问题在于第一次加载视图时不起作用。

建议非常感谢!

编辑补充:我不使用viewDidAppearviewDidLoad和核心数据的代码

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) 
} 

更多关于核心数据。我有两个实体,建议和wageClass。两者都有彼此多对多的关系。在这个viewController上,用户可以通过三个文本框(名称,增加百分比,养老金额度)来编辑提案,然后从tableView中选择相关的工资类别。

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

screenshot of the view

+0

你能看出你在'viewDidLoad'和'viewDidAppear'方法中究竟做了什么,你是什么意思是“第二次加载视图”?视图控制器通常在每个应用生命周期中加载其视图。有关在此ViewController中访问核心数据堆栈的更多代码?编辑为 –

+0

以添加所需的信息。谢谢! – camelCaseUpInYourFace

回答

0

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

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

这基本上是nil在这里,它必须之前调用这个函数,从而使这一调用不执行初始化(不能在零对象上完成)。你把它插入到首次上下文中calculateButtonTapped

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

,如果你想它的工作第一时间(即在“计算”第一次点击之前),加上上面的代码中viewDidLoad的地方,像这样:

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

如果上述方法不工作,我建议你添加一个链接到资源库,以帮助调试代码,我不能在这里找到更多的缺陷,但在添加任何细节和删除的实现,以及如何你的核心数据栈工作。

0

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

我的解决方案是分开两个view controllers中的操作,但我想知道更多关于如何在一个view controller中实现这样的操作。

相关问题