【问题标题】:UITableViewCell in SwiftSwift 中的 UITableViewCell
【发布时间】:2014-08-17 05:07:38
【问题描述】:

这是带有UITableViewControllerCoreData 的示例代码。主文件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
    }
}
}

如果在cellForRowAtIndexPath 我使用这个:

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

那么一切都很好。但如果我使用这个:

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

我看到错误: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)
}

}

CoreData 的 AddrBook.swift 类:

import UIKit
import CoreData

@objc(AddrBook)
class AddrBook: NSManagedObject {

    @NSManaged var lastname:String
    @NSManaged var firstname:String
}

【问题讨论】:

    标签: uitableview core-data swift ios8


    【解决方案1】:

    使用

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

    改为

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

    斯威夫特 4+

    使用

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

    改为

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

    【讨论】:

      【解决方案2】:

      对于 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!
          }
      

      【讨论】:

      • 为什么看起来做作的if( !(cell != nil))if cell == nil 不行吗?
      【解决方案3】:

      尝试像这样使用。

      避免感叹号

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

      我看到了,您的代码中有很多错误。 !!

      【讨论】:

      • 如果我删除感叹号,系统开始对函数标题中的选项和if !cell 发誓。我在函数头中结合了选项,这样系统就不会产生错误。但是当你使用表达式 cell.detailTextLabel.text = results[indexPath.row].firstname as NSString 我看到同样的错误 - Can't unwrap Optional.None
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 2020-02-17
      • 2015-08-16
      • 1970-01-01
      • 2015-09-01
      • 2017-09-18
      相关资源
      最近更新 更多