使用UISplitViewController的Tableview作为过滤器

时间:2016-06-01 07:06:31

标签: ios swift uitableview uisplitviewcontroller

我将UISplitViewControllers放在UITabBarController中。

enter image description here

我正在尝试将主视图用作过滤器。所以我用cellAccessoryType作为复选标记。只能选择其中一个。我为此写的代码是

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.selectedIndex = indexPath.row

    let cell:UITableViewCell = self.tableView.cellForRowAtIndexPath(indexPath)!
    cell.accessoryType = .Checkmark
    self.performSegueWithIdentifier("dispAccounts", sender: self)
        }
override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
    let cell:UITableViewCell = self.tableView.cellForRowAtIndexPath(indexPath)!
    cell.accessoryType = .None
}
override func viewDidLoad() {
    super.viewDidLoad()
    filterList = ["All Accounts","Business Accounts","Person Accounts"]
    self.tableView.allowsMultipleSelection = false
    //self.splitViewController?.maximumPrimaryColumnWidth = 140; //This line is to restrict the width of master View of UISplitVC
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return 3
}


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

    cell.textLabel?.text = filterList[indexPath.row]
    return cell
}

现在,一旦我选择“所有帐户”单元格,然后移至另一个标签“致电” 然后我回到“帐户”标签,然后我选择“商业帐户”它正在被选中,复选标记也在更新,但问题是“所有帐户”单元格的复选标记没有消失。

1 个答案:

答案 0 :(得分:1)

由于已在UITableViewUITableViewCell中实施优化,因此会发生此错误。这两个视图非常高效,Apple使其高效的一种方法是重复使用单元格而不是一直实例化新单元格(这就是为什么你要调用dequeueReusableCellWithIdentifier而不是每次都实例化一个新单元格)。

为了克服这个错误,你必须在每次使用时重置单元格。

这可以通过两种方式完成:

  • 如果您是prepareForReuse的子类,则覆盖UITableViewCell(但由于您使用标准UITableViewCell,这不适合您)
  • 直接在cellForRowAtIndexPath
  • 中重置属性

因此,您可能的解决方案如下所示:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    // Getting the cell
    let cell = tableView.dequeueReusableCellWithIdentifier("accountCell", forIndexPath: indexPath)

    // Resetting the cell
    cell.textLabel?.text = ""
    cell.selected = false

    // Configuring the cell
    cell.textLabel?.text = filterList[indexPath.row]

    // Returning the finished cell
    return cell
}