Swift中的UITableViewCell

Ale*_*mov 8 core-data uitableview swift ios8

这是带UITableViewController和的示例代码CoreData.主文件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
    }
}
}
Run Code Online (Sandbox Code Playgroud)

如果在cellForRowAtIndexPath我使用这个:

cell!.textLabel.text = results[indexPath.row].lastname + " " + results[indexPath.row].firstname
Run Code Online (Sandbox Code Playgroud)

一切都很好.但如果我用这个:

cell!.textLabel.text = results[indexPath.row].lastname
cell!.detailTextLabel.text = results[indexPath.row].firstname
Run Code Online (Sandbox Code Playgroud)

我看到错误: Can't unwrap Optional.None

怎么了?请帮忙.

以防其他类的代码

UIViewController的添加和编辑记录(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)
}

}
Run Code Online (Sandbox Code Playgroud)

AddrBook.swiftCoreData的类:

import UIKit
import CoreData

@objc(AddrBook)
class AddrBook: NSManagedObject {

    @NSManaged var lastname:String
    @NSManaged var firstname:String
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*mov 21

使用

cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")
Run Code Online (Sandbox Code Playgroud)

代替

cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")
Run Code Online (Sandbox Code Playgroud)

Swift 4+

使用

cell = UITableViewCell(style: .value1, reuseIdentifier: "Cell")
Run Code Online (Sandbox Code Playgroud)

代替

cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")
Run Code Online (Sandbox Code Playgroud)


Aks*_*Aks 8

对于Swift 4+,请使用:

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!
    }
Run Code Online (Sandbox Code Playgroud)

  • 为什么看起来做作的`if(!(cell != nil))`; `if cell == nil` 不行吗? (5认同)