解析和斯威夫特。获取 UITableView 中带有复选标记的单元格。 “不能调用参数。”
Posted
技术标签:
【中文标题】解析和斯威夫特。获取 UITableView 中带有复选标记的单元格。 “不能调用参数。”【英文标题】:Parse and Swift. Get cells in UITableView which have a checkmark. "Cannot invoke argument.“ 【发布时间】:2015-06-02 00:49:43 【问题描述】:我正在尝试从 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
编辑2:
import UIKit
导入解析 导入 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)
【问题讨论】:
【参考方案1】:当你调用你的函数时,你正在指定参数类型(这就是为什么错误消息说你用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
中的循环更改为
for index in 1...section
self.selectedRowSets.append(NSMutableIndexSet())
【讨论】:
评论不用于扩展讨论;这个对话是moved to chat。【参考方案2】:另一种解决方案是在最后解析 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)
【讨论】:
以上是关于解析和斯威夫特。获取 UITableView 中带有复选标记的单元格。 “不能调用参数。”的主要内容,如果未能解决你的问题,请参考以下文章
在 UITableView 的单元格中下载图像的最佳实践? iOS/斯威夫特
UITableView - UITableViewCell.Style .subtitle - 如何使 UIImageView 循环? - 斯威夫特 5