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

我不是说你应该完全复制和粘贴该代码,这就是为什么我反复说“类似”。 –