使用 UISplitViewController 的 Tableview 作为过滤器
Using Tableview of a UISplitViewController as a filter
我将 UISplitViewControllers 放在 UITabBarController 中。
我正在尝试将主视图用作过滤器。所以我使用 cellAccessoryType 作为复选标记。只有一个可以 selected。我为此编写的代码是
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
}
现在一旦我 select 'All Account' 单元格,然后我移动到另一个选项卡 'Call'
然后我回到 'Account' 选项卡,然后我 select 'Business Accounts' 它正在 selected 并且复选标记也在更新,但问题是 'All accounts' 单元格的复选标记是不会消失。
此错误的发生是由于 UITableView
和 UITableViewCell
中已实施的优化。这两个视图非常高效,Apple 使它们如此高效的一种方式是重用单元而不是一直实例化新单元(这就是为什么你调用 dequeueReusableCellWithIdentifier
而不是每次都实例化新单元)。
为了克服这个bug,那么每次使用时都必须重新设置单元格。
这可以通过两种方式完成:
- 覆盖
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
}
我将 UISplitViewControllers 放在 UITabBarController 中。
我正在尝试将主视图用作过滤器。所以我使用 cellAccessoryType 作为复选标记。只有一个可以 selected。我为此编写的代码是
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
}
现在一旦我 select 'All Account' 单元格,然后我移动到另一个选项卡 'Call' 然后我回到 'Account' 选项卡,然后我 select 'Business Accounts' 它正在 selected 并且复选标记也在更新,但问题是 'All accounts' 单元格的复选标记是不会消失。
此错误的发生是由于 UITableView
和 UITableViewCell
中已实施的优化。这两个视图非常高效,Apple 使它们如此高效的一种方式是重用单元而不是一直实例化新单元(这就是为什么你调用 dequeueReusableCellWithIdentifier
而不是每次都实例化新单元)。
为了克服这个bug,那么每次使用时都必须重新设置单元格。
这可以通过两种方式完成:
- 覆盖
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
}