解析和斯威夫特。获取 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.TypeNSIndexPath.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

(原)关于获取ffmpeg解析rtsp流sdp中带有sps,pps的情况

UITableView 中带有自定义单元格的部分

在uitableview中带有空格填充的圆形单元格

uiViewController 中的 uiTableView:缺少某些东西