【问题标题】:UITableView and UITableViewCell SwiftUITableView 和 UITableViewCell Swift
【发布时间】:2014-08-08 18:23:10
【问题描述】:

我正在使用 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.
    }
}

这是我的 TableViewController 中的代码:

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 中,但我一直收到错误 this error: tableviewcell does not implement its superclass's required members

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

【问题讨论】:

    标签: objective-c uitableview swift xcode6


    【解决方案1】:

    您的问题是您正在注册该类——只有当您完全在代码中创建单元格时才应该这样做(即,子视图是以编程方式创建的)。如果您在情节提要中制作了单元格,请不要注册任何内容。如果您是在 xib 中制作的,请注册 nib。所有这些行都像,

    @IBOutlet var projectLabel: UILabel! = UILabel()
    

    没有意义。您正在创建一个没有框架的新标签,但我假设您已经在 IB 的某个地方创建了这些标签(因为您正在使用 IBOutlets)。如果您确实在 IB 中创建了它们,那么这些行应该是这样的,

    @IBOutlet var projectLabel: UILabel!
    

    【讨论】:

    • 它们是在 IB 中创建的。那么,我不应该像上面那样注册它们吗?
    • @jelliott,不,你不应该。注册该类会告诉表格视图从哪里获取单元格(及其视图),因此您不会看到您在 IB 中创建的任何子视图。
    • 这就是我最初的样子,但仍然没有运气..我已经经历了一切。
    • 您是否更改了我在回答我展示的内容时提到的那些行(没有 "= UILabel()" )?
    • 是的,那是我原来的,改回@IBOutlet var projectLabel: UILabel!
    【解决方案2】:

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

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

    【讨论】:

    • thanks.. 修复了错误,但数据仍未显示在 tableview 中。正在保存数据并显示在控制台中,但单元格没有显示任何内容。就好像它不存在一样。
    • 这是我在控制台返回的内容:<NSManagedObject: 0x7fbac9cb18b0> (entity: ProjectTask; id: 0x7fbac9cb1910 <x-coredata:///ProjectTask/t3C0EF636-7593-4B3F-B24A-3BB022BE702A2> ; data: { desc = dfdf; edate = "Jul 08 2014"; project = dsfdf; sdate = "Jun 08 2014"; })
    • 你检查过故事板中表格视图的委托和数据源吗?
    • 是的。 TableView 具有委托和数据源集。删除自定义单元格时,一切正常。
    • 如果需要,我可以发送一个 zip。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2015-12-02
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2016-04-30
    • 2016-01-30
    相关资源
    最近更新 更多