Dies ist ein Beispielcode mit UITableViewController
und CoreData
. Die Hauptdatei 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
}
}
}
Wenn ich in cellForRowAtIndexPath
dies benutze:
cell!.textLabel.text = results[indexPath.row].lastname + " " + results[indexPath.row].firstname
dann ist alles gut. Aber wenn ich dies benutze:
cell!.textLabel.text = results[indexPath.row].lastname
cell!.detailTextLabel.text = results[indexPath.row].firstname
sehe ich den Fehler: Kann Optional.None nicht auspacken
Was ist falsch? Bitte hilf.
Falls die Codes anderer Klassen benötigt werden
Klasse UIViewController
zum Hinzufügen und Bearbeiten von Datensätzen (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 { // Wenn Zeile in Tabelle in MainTableViewController ausgewählt
currentOperation.text = "Person bearbeiten"
firstnameField.text = receivedPerson[indexPath.row].firstname
lastnameField.text = receivedPerson[indexPath.row].lastname
}
else { // Wenn in MainTableViewController auf "+" gedrückt wurde
currentOperation.text = "Person hinzufügen"
}
}
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 { // Wenn in MainTableViewController auf "+" gedrückt wurde
let projectEntity = NSEntityDescription.entityForName("Person", inManagedObjectContext: context)
var newPerson = AddrBook(entity: projectEntity, insertIntoManagedObjectContext: context)
newPerson.lastname = lastnameField.text
newPerson.firstname = firstnameField.text
}
else { // Wenn Zeile in Tabelle in MainTableViewController ausgewählt
receivedPerson[indexPath.row].firstname = firstnameField.text
receivedPerson[indexPath.row].lastname = lastnameField.text
}
context.save(nil)
self.navigationController.popViewControllerAnimated(true)
}
}
Klasse AddrBook.swift
für CoreData:
import UIKit
import CoreData
@objc(AddrBook)
class AddrBook: NSManagedObject {
@NSManaged var lastname:String
@NSManaged var firstname:String
}