0

我有一個場景,我需要使用核心數據實現父子關係。我如何在覈心數據中實現父子關係?

在表格視圖中,我有一個團隊列表(團隊可以通過用戶輸入添加),並在另一個表格中查看通過用戶輸入添加的成員列表。

我卡在哪裏,我無法實現兩個表之間的關係。我可以添加團隊和成員,但是當我選擇一個團隊時,它會顯示我添加的所有成員。應該是,在選擇一個團隊時,它應該向與其相關的所有成員顯示相關成員。

任何人都可以用這個場景中的例子回答,否則我可以展示我在編碼部分做了什麼,如果需要的話。

在此先感謝!

隊表視圖控制器

class GroupTable: UITableViewController { 

let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 

var teamData = [Teams]() 


override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 

override func viewWillAppear(animated: Bool) { 

    let request = NSFetchRequest(entityName: "Teams") 

    do{ 
     teamData = try managedObjectContext.executeFetchRequest(request) as! [Teams] 
    } catch let error as NSError { 
     print("\(error), \(error.userInfo)") 
    } 

    self.tableView.reloadData() 

} 


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if teamData.count > 0{ 

     self.tableView.backgroundView = nil 
     return teamData.count 

    } else { 
     let emptyLabel = UILabel(frame: CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)) 
     emptyLabel.text = "No Teams available at the moment, create one!" 
     emptyLabel.textAlignment = NSTextAlignment.Center 
     self.tableView.backgroundView = emptyLabel 
     self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None 
     return 0 

    } 

} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("groupCell", forIndexPath: indexPath) 

    let teamDetails = teamData[indexPath.row] 

    cell.textLabel?.text = teamDetails.teamName 
    cell.imageView?.image = teamDetails.teamImage as? UIImage 
    return cell 

} 
} 

會員表視圖控制器

class MemberTableViewController: UITableViewController { 

let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 

var memberData = [Members]() 


override func viewDidLoad() { 
    super.viewDidLoad() 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
} 

override func viewWillAppear(animated: Bool) { 

    let request = NSFetchRequest(entityName: "Members") 

    do{ 
     memberData = try managedObjectContext.executeFetchRequest(request) as! [Members] 
    } catch let error as NSError { 
     print("\(error), \(error.userInfo)") 
    } 

    self.tableView.reloadData() 

} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 

    if memberData.count > 0{ 

     self.tableView.backgroundView = nil 
     return memberData.count 

    } else { 
     let emptyLabel = UILabel(frame: CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)) 
     emptyLabel.text = "No Members in the team, add one!" 
     emptyLabel.textAlignment = NSTextAlignment.Center 
     self.tableView.backgroundView = emptyLabel 
     self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None 
     return 0 

    } 

} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("memberCell", forIndexPath: indexPath) as! ScreenThreeTableViewCell 

    // Configure the cell... 

    let memberDetails = memberData[indexPath.row] 

    cell.memberName?.text = memberDetails.memberName 
    cell.memberDesignation?.text = memberDetails.memberDesignation 
    cell.memberImage?.image = memberDetails.memberImage as? UIImage 

    return cell 
} 

我的ER模型 enter image description here

+0

看到[這個答案](http://stackoverflow.com/a/35792657/3985749)一個非常類似的問題。 – pbasdf

+0

是的,它是一樣的,除了最後的部分,有不同的方法。我需要修改很多,如果我必須遵循它們。 –

+0

一面注意:實體名稱通常是單數(例如團隊,而不是團隊),關係名稱通常表示*目標*實體,而不是來源。因此,在團隊實體中,與成員的關係可能被稱爲「成員」,而不是「團隊」。通常人們使用複數作爲關係名稱來表示它是多對多的。從成員到團隊的一對一關係將使用單數的「團隊」。 – pbasdf

回答

3

你成員視圖控制器中的僅提取所有Members,因此您所看到的並不令人意外。你需要告訴成員視圖控制器它應該使用哪一個Teams

有多種方法可以做到這一點。一個是:

  • 在類型爲Teams的成員視圖控制器中添加屬性。類似var team : Teams?
  • 執行prepareForSegue並讓它查找選定的團隊並將其分配給目標視圖控制器中的team屬性。像

    let indexPath = tableView.indexPathForSelectedRow 
    let selectedTeam = teamData[indexPath.row] 
    destinationViewController.team = selectedTeam 
    
  • 使用的東西在成員視圖控制器讀取請求斷言,像

    let predicate = NSPredicate(format:"team = %@", team) 
    

然後你只取屬於選定TeamMembers

+0

我應該在我的成員表視圖控制器中實現'prepareForSegue'嗎?你能給我一步一步的指示,請'因爲我是新的iOS開發! –

+0

我在點擊'+'按鈕(添加新團隊)時出現錯誤,在此行'let selectedTeam = teamData [indexPath.row]'。說'致命錯誤:意外地發現零,而解開一個可選值' –

+0

我不是說你應該完全複製和粘貼該代碼,這就是爲什麼我反覆說「類似」。 –