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
}
Use
cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")
instead
cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")
Use
cell = UITableViewCell(style: .value1, reuseIdentifier: "Cell")
instead
cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")
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!
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With