IOS,SWIFT,核心数据+多个表

我对ios和swift很陌生。 在单个视图中,如何将两个不同的获取请求发送到两个不同的表视图? 我有一个类级别的fetchReq函数,它使用NSPredicate来取一个参数,给我不同的结果,我想要的。 唯一知道哪个表是哪个tablView func的地方,但它看起来像决定哪些数据加载立即在viewDidLoad。 难道某种灵魂会帮助我重构核心数据代码,以便为每个表获取不同的获取请求?

import UIKit import CoreData class CustomTableViewCell : UITableViewCell { @IBOutlet var l1: UILabel? @IBOutlet var l2: UILabel? func loadItem(#number: String, name: String) { l1!.text = number l2!.text = name } } class ViewController: UIViewController, UITableViewDelegate, NSFetchedResultsControllerDelegate, UITableViewDataSource { @IBOutlet var tableView1: UITableView! //this is my second table - Ive connected it in the IB to this VC. both tables work, but are identical @IBOutlet var tableView2: UITableView! let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext var fetchedResultController: NSFetchedResultsController = NSFetchedResultsController() //the filtering happens inside this function. it gets called via didLoad, not cellsForRows func playerFetchRequest(playerType: String) -> NSFetchRequest { let fetchRequest = NSFetchRequest(entityName: "Players") let sortDescriptor = NSSortDescriptor(key: "number", ascending: true) let filter = NSPredicate(format: "%K = %@", "type", playerType) fetchRequest.sortDescriptors = [sortDescriptor] fetchRequest.predicate = filter return fetchRequest } func getFetchedResultController() -> NSFetchedResultsController { fetchedResultController = NSFetchedResultsController(fetchRequest: playerFetchRequest(playerType), managedObjectContext:managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil) return fetchedResultController } //remember: to create a table with multiple sections just implement the numberOfSectionsInTableView(_:) method func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if let numberOfRowsInSection = fetchedResultController.sections?[section].numberOfObjects {return numberOfRowsInSection} else {return 0} } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { if (tableView == tableView2) { var playerType = "Forward" var cell:CustomTableViewCell = self.tableView1.dequeueReusableCellWithIdentifier("customCell") as CustomTableViewCell let player = fetchedResultController.objectAtIndexPath(indexPath) as DataModel cell.l2?.text = player.lastName + ", " + player.firstName cell.l1?.text = player.number println(tableView) return cell } else { var playerType = "Defender" var cell:CustomTableViewCell = self.tableView2.dequeueReusableCellWithIdentifier("customCell") as CustomTableViewCell let player = fetchedResultController.objectAtIndexPath(indexPath) as DataModel cell.l2?.text = player.lastName + ", " + player.firstName cell.l1?.text = player.number println(tableView) return cell } } func tableView(tableView: UITableView!, didDeselectRowAtIndexPath indexPath: NSIndexPath!) { tableView.deselectRowAtIndexPath(indexPath, animated: true) println("You selected cell #\(indexPath.row)!") } override func viewDidLoad() { var nib = UINib(nibName: "CustomTableViewCell", bundle: nil) tableView1.registerNib(nib, forCellReuseIdentifier: "customCell") tableView2.registerNib(nib, forCellReuseIdentifier: "customCell") fetchedResultController = getFetchedResultController() fetchedResultController.delegate = self fetchedResultController.performFetch(nil) super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func controllerDidChangeContent(controller: NSFetchedResultsController!) { tableView1.reloadData() tableView2.reloadData() } } 

您需要2个fetchedResultsController,为每个表提供两个不同的获取请求。 如果你的表委托和数据源都是这个视图控制器,你需要切换并提供相应的内容…例如:

  func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if (tableView == tableView2) { return fetchedResultController2.sections?[section].numberOfObjects } else { return fetchedResultController.sections?[section].numberOfObjects } } 

另一个select是创build2个自定义的MYTableViewDataSource对象,并为每个表视图设置数据源…当你有意想不到的行为并使数据更容易控制时,这可能会更明显。

只需build立两个独立的NSFetchedResultsController对象,每个表对应一个对象:

 var forwardFetchedResultController: NSFetchedResultsController var defenderFetchedResultController: NSFetchedResultsController 

然后在viewDidLoad为每个NSFetchRequests创build它们。 在你的tableView函数中,使用正确的提取结果控制器来获取正确的表格。