2017-02-23 71 views
1

Это мой второй вопрос здесь, на сайте, поэтому любая обратная связь приветствуется в отношении формата вопроса. С учетом сказанного здесь моя проблема:Swift 2: заполнение TableView с двумя объектами CoreData

Я пытаюсь заполнить это табличное представление двумя различными объектами CoreData, и я не знаю, как это сделать. Сначала я попытался создать другой объект и сделать необходимые методы для tableview, но он не сработал. Я пытаюсь заполнить его данными из другого объекта, и я не могу заставить tableview отображать информацию со второго объекта. Мне интересно, существуют ли какие-либо известные соглашения для этого. Буду признателен за любую оказанную помощь.

import UIKit 
import CoreData 

class DataEntryTableViewController: UITableViewController{ 

@IBOutlet weak var menuButton: UIBarButtonItem! 

@IBOutlet var listaMiembros: UITableView! 

var object = [NSManagedObject]() 

var dictionary: [String:String] = [ 
    "tipoVehiculo" :"", 
    "ocupantes" :"", 
    "numDeTablilla" :"", 
    "jurisdiccion": "", 
    "estado" :"", 
    "vin" :"", 
    "year" :"", 
    "marca": "", 
    "model" :"", 
    "marbete" :"", 
    "aseguradora" :"", 
    "fechaCompra": "", 
    "fechaExpiracion": "", 
    ] 

var objectNum = -1 

@IBOutlet weak var listaMembers: UITableViewCell! 
override func viewDidLoad() { 

    super.viewDidLoad() 
    listaMiembros.delegate = self 
    listaMiembros.dataSource = self 

    // Do any additional setup after loading the view, typically from a nib. 
    //ADD SCROLL VIEW DIMENTIONS 

    if revealViewController() != nil { 
     menuButton.target = revealViewController() 
     // menuButton.action = "revealToggle:" 
      menuButton.action = #selector(SWRevealViewController.revealToggle(_:)) 

     tableView.registerClass(UITableViewCell.self,forCellReuseIdentifier: "Cell") 

    } 
} 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    //1 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

    let managedContext = appDelegate.managedObjectContext 

    //2  
    let fetchRequest = NSFetchRequest(entityName: "PageFour") 

    //3 
    do { 
     let results = try managedContext.executeFetchRequest(fetchRequest) 
     object = results as! [NSManagedObject] 
    } catch let error as NSError { 
     print("Could not fetch \(error), \(error.userInfo)") 
    } 

    self.tableView.reloadData() 
    objectNum = -1 
} 

// MARK: UITableViewDataSource 
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return object.count 
} 

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

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") 
    let person = object[indexPath.row] 
    cell!.textLabel!.text = person.valueForKey("numDeTablilla") as? String 
    return cell! 
} 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let indexPath = tableView.indexPathForSelectedRow // index path of selected cell 

    let cellIndex = indexPath!.row // index of selected cell 
    // print(indexPath?.row)//iT'S THE NUMBER YOU WANT - 1 
    let cellName = tableView.cellForRowAtIndexPath(indexPath!) // instance of selected cell 
    objectNum = cellIndex + 1 
    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let context: NSManagedObjectContext = appDel.managedObjectContext 
    let request = NSFetchRequest(entityName: "PageFour") 
    request.returnsObjectsAsFaults = false 
    do { 
     try context.save() 
    } catch { 
     print("There was a problem!") 
    } 

    do { 
     let results = try context.executeFetchRequest(request) 
     if results.count > 0 { 

      for result in results as! [NSManagedObject] { 

       if cellName?.textLabel?.text == result.valueForKey("numDeTablilla") as? String{ 

        dictionary["numDeTablilla"] = result.valueForKey("numDeTablilla") as? String 
        dictionary["marca"] = result.valueForKey("marcaField") as? String 
        dictionary["model"] = result.valueForKey("modeloField") as? String 
        dictionary["year"] = result.valueForKey("yearField") as? String 
        dictionary["tipoVehiculo"] = result.valueForKey("tipoVehiculo") as? String 
        dictionary["ocupantes"] = result.valueForKey("ocupantes") as? String 
        dictionary["jurisdiccion"] = result.valueForKey("jurisdicionVehiculo") as? String 
        dictionary["estado"] = result.valueForKey("estadoField") as? String 
        dictionary["vin"] = result.valueForKey("vinField") as? String 
        dictionary["marbete"] = result.valueForKey("numeroDeMarbete") as? String 
        dictionary["aseguradora"] = result.valueForKey("aseguradoraField") as? String 
        dictionary["fechaCompra"] = result.valueForKey("fechaCompraField") as? String 
        dictionary["fechaExpiracion"] = result.valueForKey("FechaExpiracionField") as? String 

       } 
      } 
      performSegueWithIdentifier("EditVehicle", sender: self) 
     } 

    } catch { 
     print("Fetch Failed") 
    } 
} 

@IBAction func unwindToVC(segue: UIStoryboardSegue) { 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "EditVehicle"){ 
     //prepare for segue to the details view controller 

     if let detailsVC = segue.destinationViewController as? NewVehicleController { 
      // let indexPath = self.tableView.indexPathForSelectedRow 

      detailsVC.dictionary = self.dictionary 
      detailsVC.objectNum = self.objectNum 
     } 
    } 
    //unnecessary for now 
//  if(segue.identifier == "gotoNewData"){ 
//   if let detailsVC = segue.destinationViewController as?   NewDataEntryTableViewController { 
//    //detailsVC.dictionary = self.dictionary 
//    detailsVC.objectNum = self.objectNum 
//   } 
//  } 
    self.tableView.reloadData()  
} 
} 
+0

так в чем же проблема? – raki

+0

Можете ли вы добавить изображение, показывающее, чего вы пытаетесь достичь? – Priyal

+0

Я добавил его к вопросу, но я тоже расскажу об этом здесь. Я хочу заполнить таблицу с информацией из второго объекта, но это не сработает, и я не знаю, как решить эту проблему. –

ответ

1

Во-первых, не сохраняйте managedObjects. Если объект удален из базы данных, доступ к которой приведет к сбою. Лучше использовать fetchedResultsController, который автоматически отслеживает вставки, удаления и изменения.

Самое простое решение для вашей проблемы состоит в том, чтобы иметь объекты одного типа в одном разделе и объекты другого типа в другом разделе. (У вас нет заголовка раздела, чтобы он мог отображаться как один раздел). У вас должно быть два разных fetchedResultsController - по одному для каждого раздела. И вы должны быть осторожны, чтобы преобразовать ваш tableview indexPath в правильный fetchedResultsController indexPath - но если у вас есть только два раздела, это не так сложно.

Если вы хотите, чтобы разные объекты пересекались между собой, то есть много сложнее, но это возможно.

Кроме того, я не знаю, почему вы делаете выборку в didSelectRowAtIndexPath, что кажется неправильным. Если данные связаны с управляемым объектом в этом indexPath, вы должны иметь возможность получать любые данные, которые вам нужны через отношения.

+0

Я просто добавлю для «сущностей, пересекающихся между собой»: если возможно, создайте для них родительский объект и убедитесь, что в вашей основной модели данных все они наследуются от этого объекта (существует свойство установить родительский объект в основные данные IB). Затем просто создайте запрос на выборку для родителя, и вы получите комбинацию обеих таблиц. –

+0

Это информация, которую я искал. Я займусь этим и опубликую обновления как можно скорее. Спасибо за помощь Jon and Matic! –

+0

Мне было интересно, может ли я просто добавить ячейку с названием, равным полю, которое я хочу получить от объекта coredata. Это возможно? Если да, то как я могу добавить ячейку? –