SimonTheEngineer
SimonTheEngineer

Reputation: 743

UITableViewController - Different number of cells for each section

I'm currently trying to load different entities from my CoreData model into one UITableView but under different sections. I've tried the following method:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    // #warning Incomplete method implementation.
    // Return the number of rows in the section.

    var rows = 0

    if section == 0 {
        rows = crew.count
    } else if section == 1 {
        rows = aircraft.count
    } else if section == 2 {
        rows = batteries.count
    }

    return rows
}

But that doesn't seem to work. It returns the first crew.count for every section. I should note that crew, aircraft and batteries are arrays of NSManagedObject.

Does anyone have any advice on how to implement what I'm looking for?

Thanks.

EDIT: Here are other methods I'm implementing for clarity..

var crew = [NSManagedObject]()
var aircraft = [NSManagedObject]()
var batteries = [NSManagedObject]()

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

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

    let crewFetchRequest = NSFetchRequest(entityName:"Crew")
    var crewError: NSError?
    let crewFetchedResults = managedContext.executeFetchRequest(crewFetchRequest, error: &crewError) as? [NSManagedObject]
    if let crewResults = crewFetchedResults {
        crew = crewResults
    } else {
        println("Could not fetch \(crewError), \(crewError!.userInfo)")
    }

    let aircraftFetchRequest = NSFetchRequest(entityName:"Aircraft")
    var aircraftError: NSError?
    let aircraftFetchedResults = managedContext.executeFetchRequest(aircraftFetchRequest, error: &aircraftError) as? [NSManagedObject]
    if let aircraftResults = crewFetchedResults {
        aircraft = aircraftResults
    } else {
        println("Could not fetch \(aircraftError), \(aircraftError!.userInfo)")
    }

    let batteryFetchRequest = NSFetchRequest(entityName:"Battery")
    var batteryError: NSError?
    let batteryFetchedResults = managedContext.executeFetchRequest(batteryFetchRequest, error: &batteryError) as? [NSManagedObject]
    if let batteryResults = crewFetchedResults {
        batteries = batteryResults
    } else {
        println("Could not fetch \(batteryError), \(batteryError!.userInfo)")
    }
}

// MARK: - Table view data source

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

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    // #warning Incomplete method implementation.
    // Return the number of rows in the section.

    var rows = 0

    if section == 0 {
        rows = crew.count
    } else if section == 1 {
        rows = aircraft.count
    } else if section == 2 {
        rows = batteries.count
    }

    return rows
}

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?
{
    return sectionTitles[section]
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCellWithIdentifier("CrewCell", forIndexPath: indexPath) as! UITableViewCell

    // Configure the cell...
    switch indexPath.section.description
    {
        case "0":
            cell.textLabel!.text = crew[indexPath.item].valueForKey("name") as? String
            if crew[indexPath.item].valueForKey("pilot") as? Bool == true {
                cell.detailTextLabel!.text = "Pilot"
            } else {
                cell.detailTextLabel!.text = " "
            }
            break;
        case "1":
            cell.textLabel!.text = "Aircraft"
            break;
        case "2":
            cell.textLabel!.text = "Battery"
            break;
        default:
            break;
    }

    return cell
}

Upvotes: 0

Views: 60

Answers (1)

Zell B.
Zell B.

Reputation: 10296

Your code is good, but you will need to set the number of section in tableview as well by implementing

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 3
}

EDITED:

From the edited question I can now clearly see that your problem is with your data source

let aircraftFetchRequest = NSFetchRequest(entityName:"Aircraft")
var aircraftError: NSError?
let aircraftFetchedResults = managedContext.executeFetchRequest(aircraftFetchRequest, error: &aircraftError) as? [NSManagedObject]
if let aircraftResults = crewFetchedResults {
    aircraft = aircraftResults
} else {
    println("Could not fetch \(aircraftError), \(aircraftError!.userInfo)")
}

let batteryFetchRequest = NSFetchRequest(entityName:"Battery")
var batteryError: NSError?
let batteryFetchedResults = managedContext.executeFetchRequest(batteryFetchRequest, error: &batteryError) as? [NSManagedObject]
if let batteryResults = crewFetchedResults {
    batteries = batteryResults
}

if let aircraftResults = crewFetchedResults and if let batteryResults = crewFetchedResults will return crewFetchResults so all crew,aircrafts and batteries arrays are holding exactly the same elements. You must replace these lines with if let aircraftResults = aircraftFetchedResults and if let batteryResults = batteryFetchedResults. Hope I was clear enough

Upvotes: 1

Related Questions