繁体   English   中英

解析和快速。 在UITableView中获取带有复选标记的单元格。 “无法调用参数。”

[英]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.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的循环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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM