2015-04-10 2 views
0

У меня есть UITableView, который я хочу фильтровать на основе выбора из контроллера просмотра панели слайдов. Это функция, которая возвращает возвращаемое значение формы панели.Swift filter UITableView с панелью поиска

func itemSelected(type: Item) { 

    self.selectedItem = Item.title 

    delegate?.collapseSidePanels?() 
} 

Таблица вида кода.

var myData: Array<AnyObject> = [] 
var selectedItem:Array<AnyObject> = [] 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cellID: NSString = "Cell" 
    var Cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellID as String) as! UITableViewCell 
    var data: NSManagedObject = myData[indexPath.row] as! NSManagedObject 
    if tableView == selectedItem { 
     data = self.selectedItem[indexPath.row] as! NSManagedObject 
    } else 
    { 
     data = myData[indexPath.row] as! NSManagedObject 
    } 

    Cell.textLabel?.text = data.valueForKeyPath("itemname") as? String 
    var tt = data.valueForKeyPath("itemtype") as! String 
    Cell.detailTextLabel?.text = ("Item Type: \(tt)") 
    return Cell 
} 

Мне нужно отфильтровать по типу предметов.

Редактировать - Не будет фильтроваться, так что вот полный код для tableViewController.

import UIKit 
import CoreData 
import Foundation 

@objc 
protocol tableViewControllerDelegate { 
optional func toggleLeftPanel() 
optional func toggleRightPanel() 
optional func collapseSidePanels() 
} 
class tableViewController: UITableViewController, NSFetchedResultsControllerDelegate, SidePanelViewControllerDelegate { 
var delegate: tableViewControllerDelegate? 
var myData: Array<AnyObject> = [] 
var myFilteredData: Array<AnyObject> = [] 


@IBAction func leftTapped(sender: AnyObject) { 
    delegate?.toggleLeftPanel?() 
} 

// Use this to change table view to edit mode 
// and to Change the title when clicked on. 
// Make sure to have sender set as UIBarButtonItem 
// or you can not change the title of the button. 
var condition: Bool = true 
@IBAction func buttonEdit(sender: UIBarButtonItem) { 
    if(condition == true) { 
     tableView.editing = true 
     sender.title = "Done" 
     condition = false 
    } else { 
     tableView.editing = false 
     sender.title = "Edit" 
     condition = true 
    } 

} 

let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 
var fetchedResultController: NSFetchedResultsController = NSFetchedResultsController() 


override func viewDidLoad() { 
    super.viewDidLoad() 

} 

override func viewWillAppear(animated: Bool) { 
// This is neeed when using panel view controller to show the bottom navbar. 
self.navigationController?.setToolbarHidden(false, animated: true) 
    // ref app del 
    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

    // Ref data 
    let context: NSManagedObjectContext = appDel.managedObjectContext! 
    let freq = NSFetchRequest(entityName: "Products") 
    myData = context.executeFetchRequest(freq, error: nil)! 

} 

override func viewDidAppear(animated: Bool) { 

} 

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Potentially incomplete method implementation. 
    // Return the number of sections. 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete method implementation. 
    // Return the number of rows in the section. 
    if (self.myFilteredData.count != 0) { 
     return self.myFilteredData.count 
    } else { 
     return self.myData.count 
    } 
} 

func getFetchedResultController() -> NSFetchedResultsController { 
    fetchedResultController = NSFetchedResultsController(fetchRequest: NSFetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil) 
    return fetchedResultController 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cellID: String = "Cell" 
    var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellID as String) as! UITableViewCell 
    var data: NSManagedObject 
    if (self.myFilteredData.count != 0){ 
     data = myFilteredData[indexPath.row] as! NSManagedObject 
     cell.textLabel?.text = data.valueForKeyPath("productname") as? String 
     var tt = data.valueForKeyPath("itemtype") as! String 
     cell.detailTextLabel?.text = ("Item J Type: \(tt)") 
    } else { 
     data = myData[indexPath.row] as! NSManagedObject 
     cell.textLabel?.text = data.valueForKeyPath("productname") as? String 
     var tt = data.valueForKeyPath("itemtype") as! String 
     cell.detailTextLabel?.text = ("Item Type: \(tt)") 
    } 


    return cell 
} 

override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { 
    return true 
} 

override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) { 
    let item: AnyObject = myData[sourceIndexPath.row] 
    myData.removeAtIndex(sourceIndexPath.row) 
    myData.insert(item, atIndex: destinationIndexPath.row) 
} 

// called when a row deletion action is confirmed 
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 
     switch editingStyle { 
     case .Delete: 
      // remove the deleted item from the model 
      let appDel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
      let context:NSManagedObjectContext = appDel.managedObjectContext! 
      context.deleteObject(myData[indexPath.row] as! NSManagedObject) 
      myData.removeAtIndex(indexPath.row) 
      context.save(nil) 

      // remove the deleted item from the `UITableView` 
      self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 

     default: 
      return 

     } 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "showProduct"){ 
     let selectedIndexPath:NSIndexPath = self.tableView.indexPathForSelectedRow()! 
     let genView:genViewController = segue.destinationViewController as! genViewController 
     genView.row = selectedIndexPath.row 

    } 
    else if (segue.identifier == "addProduct"){ 

    } 
} 

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

func itemSelected(item: Type) { 
    var selectedType = item.title 


    delegate?.collapseSidePanels?() 

    for (key, value) in enumerate(self.myData) { 
     if (value.valueForKeyPath("itemtype") !== "selectedType") { 
      self.myFilteredData.append(value) 
      dump(myFilteredData) 
     } else { 
      // do nothing with it 
     } 
    } 

    tableView.reloadData() 
} 

}

+0

Почему вам нужно объявить cellID как NSString, а затем передать его как String? var Cell следует называть строчной первой буквой (соглашение Swift). Кстати, вы можете использовать let there и просто опустить тип. –

+0

Редактировать - Добавлен полный код для таблицы. – MwcsMac

ответ

2

В зависимости от того, как вы данные фильтруются, можно перебрать myData в itemSelected(), найти элементы, которые вы хотите в вашем отфильтрованный список и сохранить их в новом массиве (myFilteredData).

var myFilteredData: Array<AnyObject> = [] 

func itemSelected(type: Item) { 
    self.selectedItem = Item.title 
    delegate?.collapseSidePanels?() 

    for (key, value) in enumerate(self.myData) {     
     if (value.valueForKeyPath("itemtype") == "yourCondition") { 
      self.myFilteredData.append(value) 
     } else { 
      // do nothing with it 
     } 
    } 

    tableView.reloadData() // use tableView.reloadSections with rowAnimation for better effect. 
} 

Вы бы затем перезагрузить TableView с tableView.reloadSections(_ sections: NSIndexSet, withRowAnimation animation: UITableViewRowAnimation), который будет вызывать функцию cellForRowAtIndexPath. Здесь вам нужно будет решить, хотите ли вы использовать myData или myFilteredData для ярлыков ячейки.

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

    var data:NSManagedObject 

    if (self.myFilteredData.count != 0) { 
     data = myFilteredData[indexPath.row] as! NSManagedObject 
    } else { 
     data = myData[indexPath.row] as! NSManagedObject 
    } 

    ... 
} 

Кроме того, не забудьте изменить функцию numberOfRowsInSection вернуть размер массива вы Наполнение Tableview с.

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if (self.myFilteredData.count != 0) { 
     return self.myFilteredData.count 
    } else { 
     return self.myData.count 
    } 
} 
+0

Не уверен, что я следую. Можете ли вы опубликовать пример кода? – MwcsMac

+0

EDIT: Добавлен пример кода – EmirC

+0

Ок, у меня есть весь код, и он вызывает self.myFilteredData.count! = 0, но он не фильтрует данные. Должен ли я делать что-то другое, потому что я пытаюсь фильтровать на cell.detailtextlabel vs cell.textlabel? – MwcsMac

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