0

私はコアデータを使用して親子関係を実装する必要があるシナリオを持っています。コアデータに親子関係を実装するにはどうすればよいですか?

シナリオは、私はチームのリストを持っています(チームはユーザー入力によって追加できます)。そして、別のテーブルビューには、ユーザー入力によって追加されたメンバーのリストがあります。

私が立ち往生しているところでは、私は2つのテーブルの間の関係を実装できませんでした。私はチームとメンバーを追加することができますが、チームを選択すると、追加したすべてのメンバーが表示されます。それは、チームを選ぶ際に、すべてのメンバーではなく関連するメンバーを表示するようなものでなければなりません。

誰でもこのシナリオの例で答えてもらえますか?それ以外の場合は、必要に応じてコーディング部分で行ったことを示すことができます。

ありがとうございます!

チームのテーブルビューコントローラ

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

片側の注記:エンティティ名は通常単数であり(チームではなく、チームではない)、関係名は通常、送信元ではなく宛先*エンティティを示します。チームエンティティでは、メンバーとの関係は「チーム」ではなく「メンバー」と呼ばれることがあります。多くの場合、人々はそれがto-manyであることを示すために複数の関係名を使用します。メンバーからチームへの1対1の関係は、単数の「チーム」を使用します。 – pbasdf

答えて

3

あなたメンバービューコントローラのはすべてMembersをフェッチするだけで、あなたが見ていることは驚きではありません。メンバビューコントローラに、Teamsのどれを使用すべきかを伝える必要があります。

これを行う方法は複数あります。 1つは:

  • Teamsのメンバービューコントローラでプロパティを追加します。何かのようにvar team : Teams?
  • prepareForSegueを実装して、選択したチームをルックアップし、宛先ビューコントローラのteamプロパティに割り当てます。

    let indexPath = tableView.indexPathForSelectedRow 
    let selectedTeam = teamData[indexPath.row] 
    destinationViewController.team = selectedTeam 
    
  • のようなものは、あなたが唯一の選択Teamに属しMembersをフェッチします

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

のようにメンバーのビューコントローラでのフェッチ要求で述語、何かを使用してください。

+0

メンバテーブルビューコントローラに 'prepareForSegue'を実装する必要がありますか?あなたは私にステップの指示を教えてもらえますか?私はiOS開発を初めて学びました! –

+0

「+」ボタンをクリックするとエラーが表示されます。新しいチームを追加するには、この行に 'let selectedTeam = teamData [indexPath.row]'と入力します。 '致命的なエラー:予期せず、オプション値をアンラッピングしている間にゼロが見つかりました 'と言います。 –

+0

私はあなたがそのコードを正確にコピー&ペーストしなければならないというわけではありません。 –