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

Одностороннее примечание: имена сущностей обычно сингулярны (например, команда, а не команды), а имена отношений обычно указывают объект * назначения *, а не источник. Таким образом, в группе Team отношения с Членом могут быть названы «членами», а не «командами». Часто люди используют множественное число для имени отношения, чтобы указать, что оно для многих. Индивидуальные отношения от члена к команде будут использовать единственную «команду». – pbasdf

ответ

3

Вашего viewWillAppear в контроллере представления членов просто извлекает все 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) 
    

Тогда вы будете только получать Members, которые принадлежат к выбранным Team.

+0

Должен ли я реализовать 'prepareForSegue' в моем контроллере представления таблицы элементов?не могли бы вы дать мне пошаговые инструкции, пожалуйста, потому что я новичок в разработке iOS! –

+0

Я получаю сообщение об ошибке, когда я нажимаю кнопку «+» (чтобы добавить новую команду), в этой строке 'let selectedTeam = teamData [indexPath.row]'. Говорит: «Неустранимая ошибка: неожиданно найдено нуль при развертывании необязательного значения» –

+0

Я не имел в виду, что вы должны скопировать и вставить этот код точно, поэтому я неоднократно говорил «что-то вроде». –

Смежные вопросы