2015-12-09 3 views
2

Извиняюсь заранее, если это сбивает с толку. Я новичок в Swift без предварительного опыта и обучения.Проблема с многосекционным TableView в Swift

В принципе, у меня есть UITableView, который извлекает свои данные из другого viewController с четырьмя текстовыми полями. Данные сохраняются и добавляются в таблицуView (отображаются только два поля в ячейке). Когда ячейка выбрана, она возвращается к viewController и добавляет данные в соответствующие текстовые поля. Это также использовало CoreData и NSFetchResultsController. Все это работает до сих пор, просто хотел дать немного поддержки тому, что происходит.

Проблема ... Я пытаюсь заставить tableView отображать данные в двух разделах. Я хочу, чтобы первый раздел (раздел 0) отображал данные, добавленные в список, созданные путем добавления текстовых полей в viewController. Тем не менее, tableView добавляет первую строку в качестве первого раздела (с правильным заголовком), а затем добавляет вторую строку (и далее) в качестве второго раздела (раздел 1) (с заголовком раздела). Я хочу добавить все новые элементы из viewController в раздел 0, оставив раздел 1 пустым, когда я выясню, как пересечь элементы из раздела 0 и перейти к разделу 1, выбирая строку (в будущем).

Я новичок на этом сайте, а также не мог понять, как опубликовать мой код. Если кто-то нуждается в просмотре, вам, возможно, придется пройти меня, добавив его. Кроме того, у меня проблемы с преобразованием Objective C в Swift, пожалуйста, имейте это в виду, отвечая. Спасибо!! и я прошу прощения за то, что вы были трудными.

(Tableview Controller "SLIST")

class ShoppingList: UIViewController, NSFetchedResultsControllerDelegate, UITableViewDataSource, UITableViewDelegate { 

    let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 

    var frc : NSFetchedResultsController = NSFetchedResultsController() 

    func itemFetchRequest() -> NSFetchRequest{ 

     let fetchRequest = NSFetchRequest(entityName: "SList") 
     let primarySortDescription = NSSortDescriptor(key: "slitem", ascending: true) 
     let secondarySortDescription = NSSortDescriptor(key: "slcross", ascending: true) 
     fetchRequest.sortDescriptors = [primarySortDescription, secondarySortDescription] 
     return fetchRequest 
    } 

    func getFetchRequetController() ->NSFetchedResultsController{ 

     frc = NSFetchedResultsController(fetchRequest: itemFetchRequest(), managedObjectContext: moc, sectionNameKeyPath: "slitem", cacheName: nil) 
     return frc 
    } 

    @IBOutlet weak var tableView: UITableView! 


    @IBAction func AddNew(sender: AnyObject) { 

     frc = getFetchRequetController() 
     frc.delegate = self 

     do { 
      try frc.performFetch() 
     } catch _ { 
      print("Failed to perform inital fetch.") 
      return 
     } 
     self.tableView.reloadData() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     frc = getFetchRequetController() 
     frc.delegate = self 

     do { 
      try frc.performFetch() 
     } catch _ { 
      print("Failed to perform inital fetch.") 
      return 
     } 

     self.tableView.reloadData() 

     //TableView Background Color 
     self.tableView.backgroundColor = UIColor.clearColor() 
     tableView.reloadData() 
     self.navigationItem.leftBarButtonItem = self.editButtonItem() 
     self.tableView.separatorColor = UIColor.blackColor() 
    } 

    override func viewDidDisappear(animated: Bool) { 

     frc = getFetchRequetController() 
     frc.delegate = self 

     do { 
      try frc.performFetch() 
     } catch _ { 
      print("Failed to perform inital fetch.") 
      return 
     } 
     self.tableView.reloadData() 
    } 

    //TableView Data 
    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 
     let managedObject:NSManagedObject = frc.objectAtIndexPath(indexPath) as! NSManagedObject 
     moc.deleteObject(managedObject) 
     do { 
      try moc.save() 
     } catch _ { 
      print("Failed to save.") 
      return 
     } 
    } 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 

     let numberOfSections = frc.sections?.count 
     return numberOfSections! 
    } 

    //table section headers 
    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?{ 
     let sectionHeader = "Items - #\(frc.sections![section].numberOfObjects)" 
     let sectionHeader1 = "Crossed Off Items - #\(frc.sections![section].numberOfObjects)" 
     if (section == 0) { 
      return sectionHeader 
     } 
     if (section == 1){ 
      return sectionHeader1 
     }else{ 
     return nil 
    } 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     let numberOfRowsInSection = frc.sections?[section].numberOfObjects 
     return numberOfRowsInSection! 
    } 


    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 
     let items = frc.objectAtIndexPath(indexPath) as! SList 
     cell.backgroundColor = UIColor.clearColor() 
     cell.textLabel?.text = "\(items.slitem!) - Qty: \(items.slqty!)" 
     cell.textLabel?.font = UIFont.systemFontOfSize(23) 

     return cell 
    } 
    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 


    func controllerDidChangeContent(controller: NSFetchedResultsController)  { 
     tableView.reloadData() 
    } 
    //segue to add/edit 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 

     if segue.identifier == "edit" { 

      let cell = sender as! UITableViewCell 
      let indexPath = tableView.indexPathForCell(cell) 
      let SListController:SLEdit = segue.destinationViewController as! SLEdit 
      let items:SList = frc.objectAtIndexPath(indexPath!) as! SList 
      SListController.item = items 
     } 
    } 
} 

(ViewController "SLEdit")

class SLEdit: UIViewController { 

    let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 


    @IBOutlet weak var slitem: UITextField! 
    @IBOutlet weak var sldesc: UITextField! 
    @IBOutlet weak var slqty: UITextField! 
    @IBOutlet weak var slprice: UITextField! 


    var item: SList? = nil 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     if item != nil{ 
      slitem.text = item?.slitem 
      sldesc.text = item?.sldesc 
      slqty.text = item?.slqty 
      slprice.text = item?.slprice 
     } 

     // "x" Delete Feature 
     self.slitem.clearButtonMode = UITextFieldViewMode.WhileEditing 
     self.sldesc.clearButtonMode = UITextFieldViewMode.WhileEditing 
     self.slqty.clearButtonMode = UITextFieldViewMode.WhileEditing 
     self.slprice.clearButtonMode = UITextFieldViewMode.WhileEditing 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    func dismissVC() { 
     navigationController?.popViewControllerAnimated(true) 
    } 

    @IBAction func saveButton(sender: AnyObject) { 

     if item != nil { 
      edititems() 
     } else { 
      createitems() 
     } 

     dismissVC() 
    } 


    func createitems() { 

     let entityDescription = NSEntityDescription.entityForName("SList", inManagedObjectContext: moc) 


     let item = SList(entity: entityDescription!, insertIntoManagedObjectContext: moc) 

     item.slitem = slitem.text 
     item.sldesc = sldesc.text 
     item.slqty = slqty.text 
     item.slprice = slprice.text 

     if slitem.text == nil{ 
      createitems() 

     }else{ 
      edititems() 
     } 



     do { 
      try moc.save() 
     } catch _ { 
      return 
     } 
    } 
    func edititems() { 
     item?.slitem = slitem.text! 
     item?.sldesc = sldesc.text! 
     item?.slqty = slqty.text! 
     item?.slprice = slprice.text! 


     do { 
      try moc.save() 
     } catch { 
      return 
     } 
    } 
} 
+0

Можете ли вы добавить код, чтобы мы могли видеть, что вы пробовали? –

+0

, наконец, понял это ... это как-то испортилось, но первый и второй контроллеры tableview третьего - контроллер вида, который вводит информацию. –

ответ

0

Я думаю, что проблема заключается в конфигурации FRC:

frc = NSFetchedResultsController(fetchRequest: itemFetchRequest(), managedObjectContext: moc, sectionNameKeyPath: "slitem", cacheName: nil) 

Поскольку sectionNameKeyPathslitem, FRC создает новый раздел для каждого разного значения slitem.

Если атрибут slcross используется для указания того, что этот пункт был вычеркнут список, указать, что в качестве sectionNameKeyPath:

frc = NSFetchedResultsController(fetchRequest: itemFetchRequest(), managedObjectContext: moc, sectionNameKeyPath: "slcross", cacheName: nil) 

Вам также потребуется изменить сортировку запроса выборки (он должен сортироваться так, чтобы все элементы в данном разделе были вместе):

let primarySortDescription = NSSortDescriptor(key: "slcross", ascending: true) 
let secondarySortDescription = NSSortDescriptor(key: "slitem", ascending: true) 
fetchRequest.sortDescriptors = [primarySortDescription, secondarySortDescription] 
+0

Ну, это в значительной степени решило его, кроме 2-х проблем ... 1: он выдает ошибку для «Раздел, возвращаемый значением nil для ключевого пути раздела« slcross ». Объекты будут помещены в неназванный раздел« ... это потому, что в этом разделе ничего нет, пока я не перечеркнет его (выбирая строку в будущем) и добавляет его в раздел? и 2: он не перезагружается, когда элемент добавляется/редактируется. Я добавил tableview.reloadData() в конец разделаHeader, но он говорит, что он никогда не будет выполнен. –

+0

Да, предупреждение о значении nil для секций связано с тем, что ваши элементы 'SList' имеют' slcross = nil'. Установите значение по умолчанию (false), а затем, когда вы перекрестите его, вы можете изменить его на true. Что касается проблемы перезагрузки, вам не нужно повторно инициализировать frc и выполнить выборку в «AddNew» IBAction или в представленииDidDisappear.Делегат frc должен обрабатывать обновление таблицы. – pbasdf

+0

Извините за задержку ответа. Я удалил его повторную инициализацию из AddNew IBAction и viewDidDisappear, и он не перезагрузил таблицу, пока я не перезагрузил симулятор (тогда остановится, а затем снова запустится). Боковое примечание ... Я изменил frc sectionNameKeyPath с «slcross» на nil и, похоже, решил проблему перезагрузки, и заголовок остается, даже если в списке ничего нет (это нормально). Решает ли это это или это вызовет проблемы, когда я в конечном итоге получаю предметы для перехода к этому разделу? –

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