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