2017-04-13 52 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中實現這樣的操作。

相關問題