我正在尝试使用带有多项选择的UITableview
和所选行的复选标记附件视图。如果我打开和关闭tableView:didSelectRow
中的配件视图,这大部分都有效。
但是,我尝试构建一个selectAll
方法,我发现在旋转完所有单元格后,所选单元格的数组被清除,如果我再调用reloadData()
,则选择它们。
我怀疑重新加载表会清除选择。在设置选定的标志和附件视图后,我不知道有任何其他方法可以绘制所有单元格。
我想知道是否需要保留自己的选定行数组。有没有其他人建造这样的东西?它似乎是一种常见的情况。
赞赏任何提示或示例代码。
答案 0 :(得分:0)
获取一个数组,并将每个选定单元格的indexPath
添加到其中,并在cellForRowAt...
中添加一个条件,如果该数组包含该特定indexPath
,则将其设置为选中。
答案 1 :(得分:0)
你需要在cellForRowAtIndexPath方法中添加一些功能,就像这样你的视图控制器代码
让我们举一个照片库应用的例子
class CreateEvent: UIViewController,UITableViewDataSource,UITableViewDelegate {
var yourArray : [Photo] = [Photo]()
//MARK: - Content TableView Methods
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath)
let objPhoto = yourArray[indexPath.row]
if objPhoto.isPhotoSelected == true
{
cell.accessoryType = .Checkmark
}
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
let objPhoto = yourArray[indexPath.row]
objPhoto.isPhotoSelected = true
let cell = tableView.cellForRowAtIndexPath(indexPath)
cell.accessoryType = .Checkmark
}
//MARK: Action Method
func selectAllPhoto()
{
for objPhoto in yourArray
{
objPhoto.isPhotoSelected = true
}
tableView.reloadData()
}
}
还需要创建自定义对象,例如
class Photo: NSObject {
var photoName:String = ""
var isPhotoSelected = false
}
希望这会对你有所帮助
答案 2 :(得分:0)
您可以采取两种方法。一种是跟踪选定的行号。为此,您可以使用NSMutableIndexSet
或其Swift对应IndexSet
。
基本上,当选择一行时,将其添加到集合中。取消选择后,将其从集中移除。在cellForRowAtIndexPath
中,您可以使用containsIndex
来确定是否应显示复选标记。
由于您在重新加载表时明确提到选择问题,因此值得考虑存储行号(无论是在集合还是数组中)的问题,以及行号可以更改。
假设我选择了行4,7和9,这些值存储在索引集中。当我重新加载数据时,可能已经在" old"之后插入了新数据。第8行,所以现在我应该选择第4,7行和第10行,但我仍然会选择4,7和9。
对此的解决方案是为应选择的数据存储某种唯一标识符。这取决于您的数据,但是您说每个项目都有一个唯一的字符串。您可以将此字符串存储在NSMutableSet
或Swift Set
中,这样可以轻松检查是否使用contains
选择了某个项目
答案 3 :(得分:0)
多重选择的最佳方法是
获取一个模型对象,其中包含所有属性和一个额外的boolean
属性(如isSelected
)来保留选择。
如果选择行
isSelected
布尔值(如isSelected =
!isSelected
)并重新加载表。如果选择所有案例
isSelected = true
。希望这个概念可以帮助你建立自己的逻辑。
快乐的编码......