0

スライド パネル ビュー コントローラーからの選択に基づいてフィルター処理する 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
}

itemtype でフィルタリングする必要があります。

編集 - まだフィルタリングされないため、ここに 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() 
}

}

4

1 に答える 1

2

データをどのようにフィルタリングするかに応じて、 をループしmyDataitemSelected()フィルタリングされたリストで必要な要素を見つけて、それらを新しい配列 ( 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.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
    }
}
于 2015-04-10T12:47:33.087 に答える