12 Stimmen

UITableViewCell in Swift

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
}

26voto

Alexey Nakhimov Punkte 2673

Verwenden Sie

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

anstatt

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

Swift 4+

Verwenden Sie

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

anstatt

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

13voto

Ash Punkte 4935

Für Swift 4+ verwenden Sie:

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 = "Hallo"
        return cell!
    }

0voto

Apple Kid Punkte 623

Versuche es so zu benutzen.

Vermeide einfach die Ausrufezeichen

cell.text = results[indexPath.row].lastname as NSString
cell.detailTextLabel.text = results[indexPath.row].firstname as NSString

Und ich sehe, dass es viele Fehler in deinem Code gibt. !!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X