cell.accessoryType = .复选标记

Posted

技术标签:

【中文标题】cell.accessoryType = .复选标记【英文标题】:cell.accessoryType = .Checkmark 【发布时间】:2015-01-20 21:36:40 【问题描述】:

在我的待办事项列表应用程序中,我使用静态单元格来显示一个 NSMutableArray 的待办事项,这些事项永远不会改变。一旦有人点击单元格,就会显示一个 .Checkmark 的附件类型并标记为已完成。我正在尝试做但尚未找到答案的是,一旦数组中的每个项目都完成并添加复选标记,就会为整个列表返回completionDate。我发现可以在 NSArray 或 NSMutableArray 上调用的最接近的方法是 -removeAllObjects,但我不希望 Array 被破坏。这是一份需要继续提供的每日清单。我真的很感激有人指出我正确的方向,甚至是关于如何做到这一点的更好建议。谢谢!

var checklistItems: NSMutableArray = []

override func viewDidLoad() 
    super.viewDidLoad()
    loadInitialData()

 func loadInitialData()

    var item1 = Checklist(name: "Check Tires")
    self.checklistItems.addObject(item1)

    var item2 = Checklist(name: "Check Controls")
    self.checklistItems.addObject(item2)

    var item3 = Checklist(name: "Check Lights")
    self.checklistItems.addObject(item3)

    var item4 = Checklist(name: "Check Oil")
    self.checklistItems.addObject(item4)

    var item5 = Checklist(name: "Check Chassis")
    self.checklistItems.addObject(item5)

    var item6 = Checklist(name: "Check Sidestand")
    self.checklistItems.addObject(item6)

 

  override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    // #warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 1


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    // #warning Incomplete method implementation.
    // Return the number of rows in the section.
    return self.checklistItems.count



override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("ListPrototypeCell", forIndexPath: indexPath) as UITableViewCell

    // Configure the cell...
    var checklistItems: Checklist = self.checklistItems.objectAtIndex(indexPath.row) as Checklist

    cell.textLabel?.text = checklistItems.itemName
    if checklistItems.completed

        cell.accessoryType = .Checkmark



    

    else

        cell.accessoryType = .None

    

    return cell


override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

        tableView.deselectRowAtIndexPath(indexPath, animated: false)

        var tappedItem: Checklist = self.checklistItems.objectAtIndex(indexPath.row) as

        Checklist

        tappedItem.completed = !tappedItem.completed

        tableView.reloadData()


【问题讨论】:

你需要知道什么时候所有的项目都完成了? 是的。用户完成整个列表后,它会返回列表完成的月/日/年。 【参考方案1】:

我不确定您希望如何从该列表中返回完成日期,可能是通过委托方法或通过展开 segue,但我可以建议一种方法来确定是否检查了整个列表。

如果你添加一个NSMutableSet来保存被检查的项目,当被检查的项目集的计数等于数组的计数时,你可以快速确定所有项目都被检查-

var checklistItems: NSMutableArray = []
var checkedItems = NSMutableSet()

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

        tableView.deselectRowAtIndexPath(indexPath, animated: false)

        var tappedItem: Checklist = self.checklistItems.objectAtIndex(indexPath.row) as

        Checklist

        tappedItem.completed = !tappedItem.completed

        if (tappedItem.completed) 
           checkedItems.addObject(tappedItem)
         else 
           checkedItems.removeObject(tappedItem)
        
        if (self.allChecked()) 
            self.performSegueWithIdentifier("unwindFromChecklist", sender:self)
         else 
            tableview.reloadData()
        


func allChecked() -> Bool 
    return checkedItems.count == checklistItems.count

我添加了一个 unwind segue 调用 - 您可以在调用视图控制器的 unwind 方法中简单地获取当前日期和时间,或者您可以在调用 unwind segue 之前在此视图控制器的属性中设置当前日期

【讨论】:

感谢 Paulw11,一旦完成,它可以展开到带有完成日期的主视图控制器。 您需要考虑您想要的用户体验 - 您是否希望在检查最后一项后立即展开?您是否希望用户按下仅在检查所有内容时才启用的“返回”或“完成”按钮?是否要在检查最后一项后提示用户? 我希望在检查最后一项后立即展开。没有理由打完。我会保留一个取消按钮,以防他们没有时间完成它或者他们只是检查列表。 另外,现在我已经添加了 NSMutable 集,我收到了一个警告,表明该类没有初始化程序。我正在四处寻找原因。 您可能需要在 init() 函数中添加集合的初始化,尽管NSMutableSet() 指定的默认值应该足够了【参考方案2】:

我认为 Paul 的方法来检查是否 你真的不需要创建另一个数组。一种“快速”的方式。

    func allChecked() -> Bool
    
// create an array with only the uncompleted items 
       let uncompletedArray = self.checkListItems.filter  $0.completed == false
 // if this array is empty all items are completed
       return uncompletedArray.count == 0;
    

【讨论】:

我确实想到了这种方法,但涉及反复迭代数组,尽管它是一个小数组。 FWIW 你可以在 Objective-C 中用一个块做同样的事情。这种方法没有什么特别“敏捷”的地方

以上是关于cell.accessoryType = .复选标记的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 中 cell.accessoryType 的问题

accessoryType用法

Swift 3:为啥我不能在 didDeselectRowAt 中更改 cell.accessoryType 和 cell.textLabel

cell.accessoryType 在 tableView cellForRowAtIndexPath ... 方法中不起作用

UITableViewCell 的附件类型 accessoryType 选中详情箭头

iosttableViewCell右侧的箭头,圆形等