2016-10-02 2 views
0

Пожалуйста, простите, если это дублированный вопрос. Я выполнял поиск настолько тщательно, насколько мог, но ни один из других вопросов, которые я видел относительно основных данных в UITableView, по-видимому, не подходит для того, что я пытаюсь сделать.Нужна помощь в отображении основных данных в UITableView в Swift

В принципе, у меня есть два "таблицы" в моем Core Data:

cstProjects и plProjects

Обе таблицы имеют атрибуты называются "propertyOwner" и "PropertyID" (среди прочих), которые устанавливаются в качестве строк ,

Далее, в ViewController у меня есть экземпляр табличного представления со стилем, установленным в Subtitle, а идентификатор ячейки - «projectCell».

Поскольку у меня есть две таблицы в моих основных данных, я инициализирую таблицу двумя разделами. Я хотел бы, чтобы первый раздел показывал все проекты в таблице cstProjects, а второй раздел показывал все проекты в таблице plProjects.

Вот мой код ViewController. Я вложил комментарии, чтобы объяснить это как можно лучше. Функции, которые я создал, могут немного переборщить, чтобы выяснить, сколько «строк» ​​каждого раздела должно иметь, но я не знал о более простом способе его решения.

В коде внизу, где отображаются двойные вопросительные знаки "??" где я не уверен, что нужно сделать, чтобы показать текущую «строку» типа проекта, который мы сейчас итерируем.

В конечном итоге, если бы мне пришлось как можно больше упростить мой вопрос, мне просто нужно знать, как отображать строки таблицы данных ядра в UITableView.

import UIKit 
import CoreData 

class LoadProjectViewController: UIViewController, UITableViewDataSource, NSFetchedResultsControllerDelegate { 

    let projectSectionCount: Int = 2 
    let cstSection: Int = 0 
    let plSection: Int = 1 

    // Implement UITableViewDataSource methods 
    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return projectSectionCount 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     switch(section) { 
     case cstSection: 
      return getCSTProjects() 
     case plSection: 
      return getPLProjects() 
     default: 
      return 0 
     } 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("projectCell")! as UITableViewCell 

     switch (indexPath.section) { 
      case cstSection: 
       //this is where I need to set the property owner for the CST Project 
       cell.textLabel!.text = ?? 

       //this is where I need to set the project ID for the CST Project 
       cell.detailTextLabel!.text = ?? 
      case plSection: 
       //this is where I need to set the property owner for the PL Project 
       cell.textLabel!.text = ?? 

       //this is where I need to set the project ID for the PL Project 
       cell.detailTextLabel!.text = ?? 

      default: 
       cell.textLabel!.text = "Unknown" 
     } 

     return cell 
    } 

    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
     switch section { 
      case cstSection: 
       return "Standing Timber Projects" 
      case plSection: 
       return "Purchased Logs" 
      default: 
       return "Unknown" 
     } 
    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 
    } 

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

    func getCSTProjects() -> Int { 
     let appDel:AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate) 
     let context: NSManagedObjectContext = appDel.managedObjectContext 
     let request = NSFetchRequest(entityName: "CSTProjects") 
     var results = [AnyObject]() 

     request.returnsObjectsAsFaults = false 

     do { 
      results = try context.executeFetchRequest(request) 
     } catch let error { 
      print("There was an error loading the data. \(error)") 
     } 

     if (results.count > 0) { 
      return results.count 
     } else { 
      return 0 
     } 
    } 


    func getPLProjects() -> Int { 
     let appDel:AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate) 
     let context: NSManagedObjectContext = appDel.managedObjectContext 
     let request = NSFetchRequest(entityName: "PLProjects") 
     var results = [AnyObject]() 

     request.returnsObjectsAsFaults = false 

     do { 
      results = try context.executeFetchRequest(request) 
     } catch let error { 
      print("There was an error loading the data. \(error)") 
     } 

     if (results.count > 0) { 
      return results.count 
     } else { 
      return 0 
     } 

    } 
} 

ответ

0

Первое, что вам нужно сделать в этом методе - это посмотреть, какой экземпляр вы хотите отобразить. Для этого вам необходимо изменить методы getCSTProjects и getPLProjects, чтобы сохранить результаты запроса выборки, а не отбрасывать их. Это можно сделать, добавив новые атрибуты контроллерам представления для хранения массивов. В соответствующей заметке вы действительно не хотите называть эти методы от tableView(tableView:, numberOfRowsInSection:), потому что этот метод можно получить много. Делать выборки там в значительной степени гарантирует низкую производительность.

Чтобы получить конкретный экземпляр, просмотрите его в одном из массивов, которые у вас есть, используя аргумент indexPath, чтобы получить индекс массива.

После того, как у вас есть этот конкретный экземпляр, вам нужно найти значения атрибутов, которые вы указали в этих типах объектов Core Data. Что нужно сделать, зависит от того, как определяются ваши объекты CSTProjects и PLProjects и о том, созданы ли для них подклассы NSManagedObject.

Например, если ваш CSTProjects объект имеет атрибут строка называется name, который вы хотите использовать в качестве заголовка, и вы не имеют NSManagedObject подкласс, вы могли бы использовать это:

cell.textLabel!.text = currentInstance.value(forKey: "name") as? String 

Если вы действительно есть подкласс NSManagedObject (и это всегда хорошая идея), это было бы

cell.textLabel!.text = currentInstance.name 
0

Вместо того, чтобы объединить два объекта (или таблицы) в один fetchedResultsController, было бы проще переносить данные в одну таблицу и получать доступ к ней.

Если таблицы достаточно схожи, вы можете сделать это в одной таблице с кодом типа, чтобы отличать записи, в которых вы нуждаетесь, например, используя отфильтрованное представление, чтобы таблицы выглядели как один тип или другой в другие части вашего кода. Это означало бы, что любые поля, ограниченные одним типом, были бы необязательными, чтобы другие могли их игнорировать. Тогда frc может использовать поле кода в качестве разрыва раздела.

В качестве альтернативы, если таблицы достаточно разные, вы можете добавить третью таблицу, например Проекты, которые имели опциональную связь один-к-одному с двумя другими таблицами и диск frc из этой третьей таблицы, используя ссылки для заполнения полей в таблицеView в методе делегата configure.

Помимо упрощения создания текущей структуры frc, любой из этих подходов упростит добавление третьего или четвертого типа, если ваши требования будут расширяться в будущем и избегут осложнений, которые неизбежно следуют изгиба API подходит для использования, для которого он не предназначен.

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