Search code examples
xcodeuitableviewswiftcustom-cell

TableViewController and CustomCell using Swift


I'm trying to populate a TableViewController with data and display it using a CustomCell so I can have two labels and a button on each row.

I have placed the two labels and the button in the PrototypeCell within the Main Storyboard.

I have created a CustomCellTableViewCell class:

import UIKit

class CustomCellTableViewCell: UITableViewCell {

@IBOutlet var customCellLabel1: [UILabel]!
@IBOutlet var customCellLabel2: [UILabel]!

@IBOutlet var CustomCellButton: [UIButton]!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}

and within my UITableViewController I have:

var DevicesList: Array<AnyObject>=[]
var ii: Int = 1

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

    let CellID : NSString = "DeviceCell"

    var cell : CustomCellTableViewCell = tableView.dequeueReusableCellWithIdentifier(CellID) as CustomCellTableViewCell

    if DevicesList.count > 0 {
        var data: NSManagedObject = DevicesList[indexPath.row] as NSManagedObject

        cell.customCellLabel1[indexPath.row].text = data.valueForKeyPath("name") as? String

        println("loading row \(ii) loaded!")
        ii++
    } else {
                println("nothing loaded...?")
    }

    println("cell loaded")

    return cell

}

when I run it though the first row is loaded but then I get a:

loading row 1 loaded!
cell loaded
fatal error: Array index out of range

The guilty line is shown as this one:

        cell.customCellLabel1[indexPath.row].text = data.valueForKeyPath("name") as? String

I have 7 rows to load so somewhere I need to append the labels/button array and if so where/how do I do it?

Thanks!

Kostas


Solution

  • Just for future searches here is how it was solved:

    Created new class:

    import UIKit
    
    class DeviceCustomCell: UITableViewCell {
    
    @IBOutlet var myLabel1: UILabel!
    
    @IBOutlet var myLabel2: UILabel!
    
    @IBOutlet var myButton: UIButton!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }
    
    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    
        // Configure the view for the selected state
    }
    
    @IBAction func PressButton(sender: AnyObject) {
    
        myButton.setTitle("OFF", forState: UIControlState.Normal)
    
    }
    

    }

    Linked the labels and button from the Main storyboard to the two variables (New Reference Outlet).

    Important to have the Identifier as "DeviceCustomCell" for the Prototype Cell and then modify the function:

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    
        let CellID : NSString = "DeviceCustomCell"
    
        var cell = tableView.dequeueReusableCellWithIdentifier("DeviceCustomCell") as DeviceCustomCell
    
    
        if DevicesList.count > 0 {
            var data: NSManagedObject = DevicesList[indexPath.row] as NSManagedObject
    
            var devicename : String = data.valueForKeyPath("name") as String
            var lastchanged: String = data.valueForKeyPath("lastChangedRFC822") as String
    
            cell.myLabel1.text = devicename
            cell.myLabel2.text = lastchanged
    
            println("loading row \(ii) loading...")
            ii++
    
            return cell
    
    
    
        } else {
                    println("nothing loaded...?")
        }
    
    
        return cell
    
    }
    

    This now works nicely!

    Important is to understand this line:

        var cell = tableView.dequeueReusableCellWithIdentifier("DeviceCustomCell") as DeviceCustomCell
    

    as it holds the key to success! :)

    Kostas