我正在学习swift,我正在尝试构建一个用于记录锻炼的应用程序。
我正在使用不同的视图和原型单元格,它完美无缺。
但现在在一个视图中我有两个tableview,每个都有相同类型的原型单元格,也是一个自定义单元格:
Container
它只有一个ID和一个标签。我在另一个tableview中使用它,它的工作非常完美。
我在stackoverflow上找到了如何在一个View中使用多个UITableViews,它向我展示了与标准单元格完美匹配的数据。
但是,只要我在故事板中添加标识符,并在代码中建立插座连接并使用这些标识符,我就会收到错误。
快速信息,我试过这一行:
import UIKit
class muscleCell: UITableViewCell {
@IBOutlet weak var lblDescription: UILabel!
var id : Int64?
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
}
也是这样的(因为我发现它可能会有所帮助):
self.lvMainMuscles.register(UITableViewCell.self, forCellReuseIdentifier: "mainMuscleCell")
但也没有用。
self.lvMainMuscles.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
我得到的错误是:
无法将“UITableViewCell”类型的值(0x10a63c778)转换为 'WorkoutPartner.muscleCell'(0x107b422f0)。 在这一行:
import UIKit
class MachineController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var txtName: UITextField!
@IBOutlet weak var txtType: UITextField!
@IBOutlet weak var deleteToolbar: UIToolbar!
@IBOutlet weak var btnDelete: UIBarButtonItem!
@IBOutlet weak var lvMainMuscles: UITableView!
@IBOutlet weak var lvSupportingMuscles: UITableView!
var machineId: Int64?
var objMachine = Machine(connection: wpdb().db!)
var objMuscle = Muscle(connection: wpdb().db!)
var mainMuscleData : Array<Muscle.structMuscleList> = []
var supportingMuscleData : Array<Muscle.structMuscleList> = []
override func viewDidLoad() {
super.viewDidLoad()
if (machineId != nil) {
if (objMachine.loadById(Id: machineId!) == true) {
self.title = objMachine.name
txtName.text = objMachine.name
txtType.text = String(objMachine.typeId)
}
} else {
deleteToolbar.isHidden = true
}
lvMainMuscles.delegate = self
lvMainMuscles.dataSource = self
lvMainMuscles.allowsMultipleSelection = true
self.lvMainMuscles.register(UITableViewCell.self, forCellReuseIdentifier: "mainMuscleCell")
lvSupportingMuscles.delegate = self
lvSupportingMuscles.dataSource = self
lvSupportingMuscles.allowsMultipleSelection = true
self.lvSupportingMuscles.register(UITableViewCell.self, forCellReuseIdentifier: "supportingMuscleCell")
getData()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func btnSaveClick(_ sender: Any) {
objMachine.name = txtName.text!
objMachine.isSystem = false
objMachine.typeId = Int64(txtType.text!)!
let returnId = objMachine.save()
print("edited/saved id: \(returnId)")
let selectedrows = lvMainMuscles.indexPathsForSelectedRows
if (selectedrows?.count)! > 0 {
for row in selectedrows! {
print(row.row)
}
}
_ = self.navigationController?.popViewController(animated: true)
}
@IBAction func btnDeleteClick(_ sender: Any) {
let alert = UIAlertController(title: title, message: "Do you really want to delete the machine?", preferredStyle: UIAlertControllerStyle.alert)
let okAction = UIAlertAction(title: "Delete", style: .default, handler: { action in
if self.objMachine.delete() == true {
_ = self.navigationController?.popViewController(animated: true)
}
})
let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: nil)
alert.addAction(cancelAction)
alert.addAction(okAction)
self.present(alert, animated: true, completion: nil)
}
func getData() {
mainMuscleData = objMuscle.getList()
supportingMuscleData = objMuscle.getList()
// searchTextField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView == self.lvMainMuscles {
return mainMuscleData.count
} else {
return supportingMuscleData.count
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell:muscleCell!
if tableView == self.lvMainMuscles {
cell = tableView.dequeueReusableCell(withIdentifier: "mainMuscleCell") as! muscleCell
cell.lblDescription.text = mainMuscleData[indexPath.row].description
}
if tableView == self.lvSupportingMuscles {
cell = tableView.dequeueReusableCell(withIdentifier: "supportingMuscleCell") as! muscleCell
cell.lblDescription.text = supportingMuscleData[indexPath.row].description
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// tableView.deselectRow(at: indexPath as IndexPath, animated: true)
if tableView == lvMainMuscles {
let cell = self.lvMainMuscles.cellForRow(at: indexPath)!
cell.accessoryType = UITableViewCellAccessoryType.checkmark;
} else {
let cell = self.lvSupportingMuscles.cellForRow(at: indexPath)!
cell.accessoryType = UITableViewCellAccessoryType.checkmark;
}
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
if tableView == lvMainMuscles {
let cell = self.lvMainMuscles.cellForRow(at: indexPath)!
cell.accessoryType = UITableViewCellAccessoryType.none;
} else {
let cell = self.lvSupportingMuscles.cellForRow(at: indexPath)!
cell.accessoryType = UITableViewCellAccessoryType.none;
}
}
我不明白为什么,因为我在另一个视图中使用相同的单元格并且它有效。
我希望你有个主意,
非常感谢
JYB
答案 0 :(得分:0)
您已经为UITableView注册了UITableViewCell.self,因此,它正在返回它。请尝试注册自定义单元格类。
答案 1 :(得分:0)
从您的问题和代码中我理解的是,这两个表对同一UIView
中的单元格具有相同的设计。
在这种情况下,无论何时重复使用单元格设计,我们都应该创建自定义表格单元格的XIB
,使用表格注册 NIB ,然后在cellForRow
< / p>
这是我为你制作的快速Sample。
这是控制器代码部分:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var firstTable: UITableView!
@IBOutlet weak var secondTable: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
firstTable.dataSource = self
firstTable.delegate = self
secondTable.dataSource = self
secondTable.delegate = self
//Registering Cell with tables
self.firstTable.register(UINib(nibName: "MuscleTableCell", bundle: nil), forCellReuseIdentifier: "MuscleTableCell")
self.secondTable.register(UINib(nibName: "MuscleTableCell", bundle: nil), forCellReuseIdentifier: "MuscleTableCell")
}
}
extension ViewController : UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView == self.firstTable {
return 5
} else {
return 2
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if tableView == self.firstTable {
let cell = tableView.dequeueReusableCell(withIdentifier: "MuscleTableCell") as! MuscleTableCell
cell.descriptionLabel.text = "Muscle Table Cell"
return cell
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: "MuscleTableCell") as! MuscleTableCell
cell.descriptionLabel.text = "Supporting Table Cell"
return cell
}
}
}
CustomCellClass
import UIKit
class MuscleTableCell: UITableViewCell {
@IBOutlet weak var descriptionLabel: 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
}
}
答案 2 :(得分:0)
如果有人遇到同样的问题,请确定:
我通过删除这两行代码来解决它:
self.lvMainMuscles.register(UITableViewCell.self, forCellReuseIdentifier: "mainMuscleCell")
和
self.lvSupportingMuscles.register(UITableViewCell.self, forCellReuseIdentifier: "supportingMuscleCell")
我认为我的错误是,虽然我在故事板中有一个原型单元,但我已经注册了单元格。