Objective c UITableView和UITableViewCell Swift

Objective c UITableView和UITableViewCell Swift,objective-c,uitableview,swift,xcode6,Objective C,Uitableview,Swift,Xcode6,我正在使用Swift,将保存的数据加载到UITableView自定义单元格时遇到问题。我已经创建了ViewController/TableViewController和TableViewCell。表单数据正在保存并显示在控制台中。问题是,返回TableView(我的列表)时没有返回任何内容。我在自定义单元格中创建了标签,所有内容似乎都链接正确,但没有显示任何内容。。我错过什么了吗 以下是我的ViewController中的代码: import UIKit import CoreData cla

我正在使用Swift,将保存的数据加载到UITableView自定义单元格时遇到问题。我已经创建了ViewController/TableViewController和TableViewCell。表单数据正在保存并显示在控制台中。问题是,返回TableView(我的列表)时没有返回任何内容。我在自定义单元格中创建了标签,所有内容似乎都链接正确,但没有显示任何内容。。我错过什么了吗

以下是我的ViewController中的代码:

import UIKit
import CoreData

class DetailsViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate {

    var cell:UITableViewCell?
    @IBOutlet var txtPTitle: UITextField!
    @IBOutlet var txtPDesc: UITextField!
    @IBOutlet var txtSDate: UITextField!
    @IBOutlet var txtEDate: UITextField!

    // Add our date picker keyboard on Project Start Date
    @IBAction func dp(sender: UITextField!) {

        var datePickerView  : UIDatePicker = UIDatePicker()
        datePickerView.datePickerMode = UIDatePickerMode.Date
        sender.inputView = datePickerView
        datePickerView.addTarget(self, action: Selector("handleDatePicker:"), forControlEvents: UIControlEvents.ValueChanged)
    }

    func handleDatePicker(sender: UIDatePicker) {

        var dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "MMM dd yyyy"
        txtSDate.text = dateFormatter.stringFromDate(sender.date)
    }

    @IBAction func dp2(sender: UITextField!) {

        var datePickerView  : UIDatePicker = UIDatePicker()
        datePickerView.datePickerMode = UIDatePickerMode.Date
        sender.inputView = datePickerView
        datePickerView.addTarget(self, action: Selector("handleDatePicker2:"), forControlEvents: UIControlEvents.ValueChanged)
    }

    func handleDatePicker2(sender: UIDatePicker) {

        var dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "MMM dd yyyy"
        txtEDate.text = dateFormatter.stringFromDate(sender.date)
    }

    var project: String = ""
    var desc: String = ""
    var sdate: String = ""
    var edate: String = ""

    var existingItem: NSManagedObject!

    override func viewDidLoad() {
        super.viewDidLoad()

        if (existingItem != nil) {

            txtPTitle.text = project
            txtPDesc.text = desc
            txtSDate.text = sdate
            txtEDate.text = edate
        }

        //Do any additional setup after loading the view.
        txtPTitle.delegate = self
        txtPDesc.delegate = self
        txtSDate.delegate = self
        txtEDate.delegate = self
    }

    func textFieldShouldReturn(textField: UITextField!) -> Bool {

        textField.resignFirstResponder()
        txtPDesc.resignFirstResponder()
        return true
    }

    override func touchesBegan(touches: NSSet!, withEvent event: UIEvent!) {
        self.view.endEditing(true)
    }

    @IBAction func savedTapped(sender: AnyObject) {

        // Reference to our app delegate
        let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate

        // Reference moc
        let contxt: NSManagedObjectContext = appDel.managedObjectContext!
        let en = NSEntityDescription.entityForName("ProjectTask", inManagedObjectContext: contxt)
        // Check if task exists
        if (existingItem != nil) {

            existingItem.setValue(txtPTitle.text as String, forKey: "project")
            existingItem.setValue(txtPDesc.text as String, forKey: "desc")
            existingItem.setValue(txtSDate.text as String, forKey: "sdate")
            existingItem.setValue(txtEDate.text as String, forKey: "edate")

        } else {

            // Create instance of our data model and initialize
            var newItem = Model(entity: en, insertIntoManagedObjectContext: contxt)

            // Map our properties
            newItem.project = txtPTitle.text
            newItem.desc = txtPDesc.text
            newItem.sdate = txtSDate.text
            newItem.edate = txtEDate.text

            println(newItem)
        }

        // Save our context
        contxt.save(nil)

        // Navigate back to root view controller
        self.navigationController.popToRootViewControllerAnimated(true)
    }

    @IBAction func cancel(sender: AnyObject) {

        // Navigate back to root view controller
        self.navigationController.popToRootViewControllerAnimated(true)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
import UIKit
import CoreData

class ListTableViewController: UITableViewController, UITableViewDataSource {

    override func viewDidLoad() {
        super.viewDidLoad()

        //Register Our Custom Table Cell //
        self.tableView.registerClass(ProjectTableViewCell.self, forCellReuseIdentifier: "projectlist")

         func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!  {
            var cell = tableView.dequeueReusableCellWithIdentifier("projectlist", forIndexPath: indexPath) as ProjectTableViewCell

            cell.projectLabel.text = "project"
            return cell
        }

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source
    override func numberOfSectionsInTableView(tableView: UITableView!) -> Int {
        // #warning Potentially incomplete method implementation.
        // Return the number of sections.
        return 1
    }

    override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete method implementation.
        // Return the number of rows in the section.
        return 0
    }
以下是我的TableViewController中的代码:

import UIKit
import CoreData

class DetailsViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate {

    var cell:UITableViewCell?
    @IBOutlet var txtPTitle: UITextField!
    @IBOutlet var txtPDesc: UITextField!
    @IBOutlet var txtSDate: UITextField!
    @IBOutlet var txtEDate: UITextField!

    // Add our date picker keyboard on Project Start Date
    @IBAction func dp(sender: UITextField!) {

        var datePickerView  : UIDatePicker = UIDatePicker()
        datePickerView.datePickerMode = UIDatePickerMode.Date
        sender.inputView = datePickerView
        datePickerView.addTarget(self, action: Selector("handleDatePicker:"), forControlEvents: UIControlEvents.ValueChanged)
    }

    func handleDatePicker(sender: UIDatePicker) {

        var dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "MMM dd yyyy"
        txtSDate.text = dateFormatter.stringFromDate(sender.date)
    }

    @IBAction func dp2(sender: UITextField!) {

        var datePickerView  : UIDatePicker = UIDatePicker()
        datePickerView.datePickerMode = UIDatePickerMode.Date
        sender.inputView = datePickerView
        datePickerView.addTarget(self, action: Selector("handleDatePicker2:"), forControlEvents: UIControlEvents.ValueChanged)
    }

    func handleDatePicker2(sender: UIDatePicker) {

        var dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "MMM dd yyyy"
        txtEDate.text = dateFormatter.stringFromDate(sender.date)
    }

    var project: String = ""
    var desc: String = ""
    var sdate: String = ""
    var edate: String = ""

    var existingItem: NSManagedObject!

    override func viewDidLoad() {
        super.viewDidLoad()

        if (existingItem != nil) {

            txtPTitle.text = project
            txtPDesc.text = desc
            txtSDate.text = sdate
            txtEDate.text = edate
        }

        //Do any additional setup after loading the view.
        txtPTitle.delegate = self
        txtPDesc.delegate = self
        txtSDate.delegate = self
        txtEDate.delegate = self
    }

    func textFieldShouldReturn(textField: UITextField!) -> Bool {

        textField.resignFirstResponder()
        txtPDesc.resignFirstResponder()
        return true
    }

    override func touchesBegan(touches: NSSet!, withEvent event: UIEvent!) {
        self.view.endEditing(true)
    }

    @IBAction func savedTapped(sender: AnyObject) {

        // Reference to our app delegate
        let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate

        // Reference moc
        let contxt: NSManagedObjectContext = appDel.managedObjectContext!
        let en = NSEntityDescription.entityForName("ProjectTask", inManagedObjectContext: contxt)
        // Check if task exists
        if (existingItem != nil) {

            existingItem.setValue(txtPTitle.text as String, forKey: "project")
            existingItem.setValue(txtPDesc.text as String, forKey: "desc")
            existingItem.setValue(txtSDate.text as String, forKey: "sdate")
            existingItem.setValue(txtEDate.text as String, forKey: "edate")

        } else {

            // Create instance of our data model and initialize
            var newItem = Model(entity: en, insertIntoManagedObjectContext: contxt)

            // Map our properties
            newItem.project = txtPTitle.text
            newItem.desc = txtPDesc.text
            newItem.sdate = txtSDate.text
            newItem.edate = txtEDate.text

            println(newItem)
        }

        // Save our context
        contxt.save(nil)

        // Navigate back to root view controller
        self.navigationController.popToRootViewControllerAnimated(true)
    }

    @IBAction func cancel(sender: AnyObject) {

        // Navigate back to root view controller
        self.navigationController.popToRootViewControllerAnimated(true)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
import UIKit
import CoreData

class ListTableViewController: UITableViewController, UITableViewDataSource {

    override func viewDidLoad() {
        super.viewDidLoad()

        //Register Our Custom Table Cell //
        self.tableView.registerClass(ProjectTableViewCell.self, forCellReuseIdentifier: "projectlist")

         func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!  {
            var cell = tableView.dequeueReusableCellWithIdentifier("projectlist", forIndexPath: indexPath) as ProjectTableViewCell

            cell.projectLabel.text = "project"
            return cell
        }

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source
    override func numberOfSectionsInTableView(tableView: UITableView!) -> Int {
        // #warning Potentially incomplete method implementation.
        // Return the number of sections.
        return 1
    }

    override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete method implementation.
        // Return the number of rows in the section.
        return 0
    }
以下是TableViewCell中的代码

import UIKit
import CoreData

class ProjectTableViewCell: UITableViewCell {

    @IBOutlet var projectLabel: UILabel! = UILabel()
    @IBOutlet var descriptionLabel: UILabel! = UILabel()
    @IBOutlet var sdateLabel: UILabel! = UILabel()
    @IBOutlet var edateLabel: UILabel! = UILabel()

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
}
我还为NSManagedObject准备了另一个

import UIKit
import CoreData

@objc(Model)
class Model: NSManagedObject {

    //Properties feed of attributes on our database - Must match the database attributes
    @NSManaged var project: String
    @NSManaged var desc: String
    @NSManaged var sdate: String
    @NSManaged var edate: String
}
这里有我遗漏的东西吗?这让我快发疯了。我读到应该将其添加到tableviewcell中,但我不断收到错误消息:tableviewcell没有实现其超类所需的成员

init(style: UITableViewCellStyle, reuseIdentifier: String!) {
    super.init(style: UITableViewCellStyle.Value1, reuseIdentifier: reuseIdentifier)
}

请将TableViewCell类中的init替换为以下内容-

    required init(coder aDecoder: NSCoder!) {
        super.init(coder: aDecoder)
    }

您的问题是您正在注册该类——只有在完全用代码创建单元(即,子视图是以编程方式创建的)的情况下才应该这样做。如果您在故事板中创建了单元格,请不要注册任何内容。如果是在xib中创建的,则注册nib。所有这些台词都像

@IBOutlet var projectLabel: UILabel! = UILabel()
没道理。您正在创建一个没有框架的新标签,但我假设您已经在IB中的某个地方创建了这些标签(因为您使用的是IBOutlets)。如果你在IB中创建了它们,那么这些行应该是这样的

@IBOutlet var projectLabel: UILabel!

谢谢这修复了错误,但数据仍不显示在tableview中。保存数据正在工作,并显示在控制台中,但单元格没有显示任何内容。这就是我在控制台中得到的返回:
(实体:ProjectTask;id:0x7fbac9cb1910;数据:{desc=dfdfdf;edate=“2014年7月8日”;project=dsfdf;sdate=“2014年6月8日”;})
是否检查了序列图像板中表视图的委托和数据源?是的。TableView同时设置了委托和数据源。删除自定义单元格时,一切正常。如果需要,我可以发送一个zip。它们是在IB中创建的。。所以,我不应该像上面那样注册他们?@jelliott,不,你不应该。注册该类会告诉表视图从何处获取单元格(及其视图),因此您不会看到在IB中创建的任何子视图。这是我最初的想法,但仍然不走运。。我已经检查了所有内容。您是否将我在回答中提到的那些行更改为我显示的内容(没有“=UILabel()”)?是的,这就是我最初的内容,并更改回@IBOutlet var projectLabel:UILabel!