parsing和Swift。 获取具有复选标记的UITableView中的单元格。 “不能调用参数”
我试图从UITableView得到用户标记的行,然后将它们保存为Parse关系给当前用户。
这里是IBAction(保存button)和函数的代码:
@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行出现错误:
无法用types为“(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) }
当你调用你的函数时,你正在指定参数types(这就是为什么错误消息说你用UITableView.Type
和NSIndexPath.Type
调用它。
你需要指定一个UITableView和一个NSIndexPath的实例 –
就像是
getCheckmarkedCells(tableview:self.tableView indexPath: someIndexPath);
但是,您可能不希望向此方法发送特定的索引path,因为您要扫描整个表格,而不仅仅是查看特定的行。
你的根本问题是,你似乎在使用你的表视图作为数据模型 – tableview应该只是一个存储在其他数据结构中的数据视图。 例如,对于当前不在屏幕上的单元格, cellForRowAtIndexPath
可能返回nil
。
你可以使用一个NSMutableIndexSet
来存储你select的行 –
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
的相同testing来设置单元格中的附件,因为它们被重用。
您可以使用检索已检查的行
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
实例variables并将objectsDidLoad
的循环objectsDidLoad
为
for index in 1...section { self.selectedRowSets.append(NSMutableIndexSet()) }
另一个解决scheme是parsing每个单元格在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) }