Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UITableViewCell in Swift

This is a sample code with UITableViewController and CoreData. Main file MainTableViewController.swift:

import UIKit
import CoreData

class MainTableViewController: UITableViewController {

var results:AddrBook[]=[]

init(style: UITableViewStyle) {
    super.init(style: style)
}

init(coder aDecoder: NSCoder!) {
    super.init(coder: aDecoder)
}

override func viewDidLoad() {
    super.viewDidLoad()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

override func viewDidAppear(animated: Bool) {
    let request = NSFetchRequest(entityName: "Person")
    request.returnsObjectsAsFaults = false
    let appDelegate:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    let context:NSManagedObjectContext = appDelegate.managedObjectContext
    results  = context.executeFetchRequest(request, error: nil) as AddrBook[]
    self.tableView.reloadData()
}

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

override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
    return results.count
}

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell! {
    var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? UITableViewCell

    if !cell {
        cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")
    }

    cell!.textLabel.text = results[indexPath.row].lastname + " " + results[indexPath.row].firstname

    return cell
}

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject?) {

    var indexPath = self.tableView.indexPathForSelectedRow()
    let destViewController:DetailViewController! = segue.destinationViewController as DetailViewController

    if segue.identifier == "editPerson" {
        destViewController.receivedPerson = results
        destViewController.indexPath = indexPath
    }
}
}

If in cellForRowAtIndexPath I use this:

cell!.textLabel.text = results[indexPath.row].lastname + " " + results[indexPath.row].firstname

then all is good. But if I use this:

cell!.textLabel.text = results[indexPath.row].lastname
cell!.detailTextLabel.text = results[indexPath.row].firstname

I see error: Can't unwrap Optional.None

What's wrong? Help, please.

Just in case the codes of other classes

Class UIViewController for add and edit records (DetailViewController.swift):

import UIKit
import CoreData

class DetailViewController: UIViewController {

@IBOutlet var currentOperation : UILabel = nil
@IBOutlet var firstnameField : UITextField = nil
@IBOutlet var lastnameField : UITextField = nil

var indexPath = NSIndexPath()
var receivedPerson:AddrBook[]=[]

init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

init(coder aDecoder: NSCoder!) {
    super.init(coder: aDecoder)
}

override func viewDidLoad() {
    super.viewDidLoad()

    if !receivedPerson.isEmpty {        // If selected row in tableview in MainTableViewController
        currentOperation.text = "Edit Person"
        firstnameField.text = receivedPerson[indexPath.row].firstname
        lastnameField.text = receivedPerson[indexPath.row].lastname
    }
    else {       // If pressed "+" in MainTableViewController
        currentOperation.text = "Add Person"
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

@IBAction func saveButton(sender : AnyObject) {

    let appDelegate:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    let context:NSManagedObjectContext = appDelegate.managedObjectContext

    if receivedPerson.isEmpty {      // If pressed "+" in MainTableViewController
        let projectEntity = NSEntityDescription.entityForName("Person", inManagedObjectContext: context)
        var newPerson = AddrBook(entity: projectEntity, insertIntoManagedObjectContext: context)
        newPerson.lastname = lastnameField.text
        newPerson.firstname = firstnameField.text
    }
    else {       // If selected row in tableview in MainTableViewController
        receivedPerson[indexPath.row].firstname = firstnameField.text
        receivedPerson[indexPath.row].lastname = lastnameField.text
    }

    context.save(nil)
    self.navigationController.popViewControllerAnimated(true)
}

}

Class AddrBook.swift for CoreData:

import UIKit
import CoreData

@objc(AddrBook)
class AddrBook: NSManagedObject {

    @NSManaged var lastname:String
    @NSManaged var firstname:String
}
like image 417
Alexey Nakhimov Avatar asked Jun 26 '14 11:06

Alexey Nakhimov


2 Answers

Use

cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")

instead

cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")

Swift 4+

Use

cell = UITableViewCell(style: .value1, reuseIdentifier: "Cell")

instead

cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")
like image 56
Alexey Nakhimov Avatar answered Oct 20 '22 04:10

Alexey Nakhimov


For Swift 4+ , use:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCell(withIdentifier: "Cell")

        if( !(cell != nil))
        {
            cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "Cell")
        }

        cell!.textLabel?.text = "Hello"
        return cell!
    }
like image 36
Ash Avatar answered Oct 20 '22 04:10

Ash