
[英]Cannot invoke “registerClass” on UITableView in Swift
[英]Parse and Swift. Get cells in UITableView which have a checkmark. "Cannot invoke argument.“
我试图从UITableView中获取已由用户标记的行,然后将它们保存为与当前用户的Parse关系。
这是IBAction(保存按钮)和函数的代码:
@IBAction func saveButton(sender: AnyObject) {
getCheckmarkedCells(tableView: UITableView,indexPath: NSIndexPath)
}
func getCheckmarkedCells(tableView: UITableView, indexPath: NSIndexPath) {
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
if cell.accessoryType == .Checkmark {
let checkedCourse = cell.textLabel?.text
var query = PFQuery(className: "Courses")
query.whereKey("coursename", equalTo: checkedCourse!)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
// The find succeeded.
println("Successfully retrieved \(objects!.count) scores.")
// Do something with the found objects
}
}
} else {
// Log details of the failure
println("Error")
}
}
}
}
第2行出现错误:
无法使用类型为'(tableView:UITableView.Type,indexPath:NSIndexPath.Type)'的参数列表调用'getCheckmarkedCells'
我究竟做错了什么?
编辑:
// Configure cells for Checkmarks
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
if cell.accessoryType == .Checkmark
{
cell.accessoryType = .None
}
else
{
cell.accessoryType = .Checkmark
}
}
}
EDIT2:
import UIKit
导入Parse导入ParseUI
类KurseTableViewController:PFQueryTableViewController {
// Initialise the PFQueryTable tableview
override init(style: UITableViewStyle, className: String!) {
super.init(style: style, className: className)
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// Configure the PFQueryTableView
self.parseClassName = "Courses"
self.textKey = "coursename"
self.pullToRefreshEnabled = true
self.paginationEnabled = false
}
// Define the query that will provide the data for the table view
override func queryForTable() -> PFQuery {
var query = PFQuery(className: "Courses")
query.orderByDescending("coursename")
return query
}
var selectedRows = NSMutableIndexSet()
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
if (self.selectedRows.containsIndex(indexPath.row)) {
cell.accessoryType = .None
self.selectedRows.removeIndex(indexPath.row)
} else {
cell.accessoryType = .Checkmark
self.selectedRows.addIndex(indexPath.row);
}
}
}
@IBAction func saveButton(sender: AnyObject) {
//getCheckmarkedCells(tableView: UITableView indexPath: NSIndexPath)
}
/*func getCheckmarkedCells(tableView: UITableView, indexPath: NSIndexPath) {
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
if cell.accessoryType == .Checkmark {
let checkedCourse = cell.textLabel?.text
var query = PFQuery(className: "Courses")
query.whereKey("coursename", equalTo: checkedCourse!)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
// The find succeeded.
println("Successfully retrieved \(objects!.count) scores.")
// Do something with the found objects
}
}
} else {
// Log details of the failure
println("Error")
}
}
}*/
}
EDIT3:
@IBAction func saveButton(sender: AnyObject) {
let currentUser = PFUser.currentUser()
var selectedObjects = Array<PFObject>()
let cUserRel = currentUser?.relationForKey("usercourses")
for object in qObjects {
cUserRel!.removeObject(object as! PFObject)
}
println(selectedRowSets)
for selectedRows in self.selectedRowSets {
println("count")
selectedRows.enumerateIndexesUsingBlock(
{(index, stop) -> Void in
// Get object reference
if self.objects != nil{
let anObject = self.objects![index] as! PFObject
selectedObjects.append(anObject)
println(anObject)
cUserRel!.addObject(anObject)
}
})
}
currentUser?.save()
navigationController?.popViewControllerAnimated(true)
}
调用函数时,您要指定参数类型(这就是为什么错误消息指出您使用UITableView.Type
和NSIndexPath.Type
调用的原因。
您需要指定UITableView和NSIndexPath的实例-
就像是
getCheckmarkedCells(tableview:self.tableView indexPath: someIndexPath);
但是,您可能不想将特定的索引路径发送给该方法,因为您想扫描整个表,而不仅仅是查看特定的行。
您的根本问题是您似乎将表格视图用作数据模型-表格视图应该只是存储在其他数据结构中的数据视图。 例如, cellForRowAtIndexPath
可能会为当前不在屏幕上的单元格返回nil
。
您可以使用NSMutableIndexSet
存储选定的行-
var selectedRowSets = [NSMutableIndexSet]() // You will need to add a NSMutableIndexSet to this array for each section in your table
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
let selectedRows=self.selectedRowSets[indexPath.section]
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
if (selectedRows.containsIndex(indexPath.row)) {
cell.accessoryType = .None
selectedRows.removeIndex(indexPath.row)
} else {
cell.accessoryType = .Checkmark
selectedRows.addIndex(indexPath.row);
}
}
}
您应该在cellForRowAtIndexPath
使用相同的测试,以便在单元格被重用时对其进行设置。
您可以使用以下方式检索选中的行
func getSelectedObjects() {
self.selectedObjects=Array<PFObject>()
for selectedRows in self.selectedRowSets {
selectedRows.enumerateIndexesUsingBlock({index, stop in
// Get object reference
if self.objects != nil{
let anObject=self.objects![index] as! PFObject
self.selectedObjects.append(anObject)
}
})
}
}
您是否已有一个包含所有Parse Courses
的数组?
您需要为每个部分分配一个新的NSIndexSet。 删除selectedSet
实例变量,然后将objectsDidLoad
的循环objectsDidLoad
为
for index in 1...section {
self.selectedRowSets.append(NSMutableIndexSet())
}
另一个解决方案是最后解析tableView中的每个单元格,并检查其是否被标记。 我假设你只有一个部分
let rowCount = tableView.numberOfRowsInSection(0)
let list = [TableViewCell]()
for var index = 0; index < rowCount; ++index {
let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: index, inSection: 0)) as! YourCell
if cell.accessoryType = .Checkmark{
list.append(cell)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.