[英]Tableview cells data is changing when I scroll vertically in swift iOS
I have developed an iOS app it has couple of tableviews.我开发了一个 iOS 应用程序,它有几个 tableviews。 It works fine if I did not scroll, if i scroll tableview data inside cells data is changing pls make me perfect here.如果我不滚动它工作正常,如果我滚动单元格内的表格视图数据数据正在改变请让我在这里完美。 Here is the code below for first table which will have UISwitch and text.以下是第一个表的代码,其中包含 UISwitch 和文本。 For reference pls watch video: https://drive.google.com/open?id=1hVHnAyGnQFrhvzLSoJjeMzG6wlfxoURm如需参考,请观看视频: https : //drive.google.com/open? id =1hVHnAyGnQFrhvzLSoJjeMzG6wlfxoURm
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let d = self.data {
return d.count
}
return 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
if let _ = cell {} else {
cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
}
if let d = self.data {
cell?.textLabel?.text = d[indexPath.row]
let switchView = UISwitch(frame: .zero)
switchView.setOn(self.isFolderIsAdded(folderName: d[indexPath.row]), animated: true)
switchView.tag = indexPath.row // for detect which row switch Changed
switchView.addTarget(self, action: #selector(self.switchChanged(_:)), for: .valueChanged)
cell?.accessoryView = switchView
}
return cell!
}
func isFolderIsAdded(folderName:String) -> Bool{
for val in listOfSelectedFolder{
if(folderName == val ){
return true
}
}
return false;
}
@objc func switchChanged(_ sender : UISwitch!){
if let d = self.data {
if(sender.isOn){
self.delegate?.selectedSubFolder(name: d[sender.tag])
} else {
self.delegate?.deleteFilesFromFolder(folderName: d[sender.tag])
}
}
}
Here is the second table code which will have image view and text.这是第二个表代码,它将具有图像视图和文本。 I created custom cell named TableViewCell我创建了名为 TableViewCell 的自定义单元格 . . For reference pls watch video: https://drive.google.com/open?id=11snH5_henOadVCVqS9bL5SZRjcZF3vEU如需参考,请观看视频: https : //drive.google.com/open? id =11snH5_henOadVCVqS9bL5SZRjcZF3vEU
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableViewContent.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as! TableViewCell
if let _ = contentModel[self.currentMode]{
tempArr1 = appendFolderName(files: contentModel[self.currentMode]!, name: self.currentMode)!
}
if indexPath.row < tempArr1.count {
cell.setupCellData(text: tempArr1[indexPath.row])
}else{
if let res = self.getFilesFromSubFolder(contentName: self.currentMode, folderName: self.SelectedFolder) {
cell.setupCellData(text: res[indexPath.row - tempArr1.count] )
}
}
let bgColorView = UIView()
bgColorView.backgroundColor = UIColor.gray
cell.selectedBackgroundView = bgColorView
return cell
}
func setupCellData(text:String) {
let temarr = text.components(separatedBy: "@")
let str = temarr.last?.capitalized
let strq = temarr.first?.lowercased()
let newstr = strq?.components(separatedBy: "-")
let val = newstr?.last
let content = val!.lowercased() + "@" + str!
self.ContentLabel.text = content
if ((self.ContentLabel.text?.contains("pps"))!||(self.ContentLabel.text?.contains("pptx"))!||(self.ContentLabel.text?.contains("ppt"))!){
imageData.image = #imageLiteral(resourceName: "table_Content_ppt")
}else if ((self.ContentLabel.text?.contains("mp4"))! || (self.ContentLabel.text?.contains("mp3"))!){
imageData.image = #imageLiteral(resourceName: "table_Content")
}else if (self.ContentLabel.text?.contains("pdf"))!{
imageData.image = #imageLiteral(resourceName: "pdf_content")
}else if (self.ContentLabel.text?.contains("url"))!{
imageData.image = #imageLiteral(resourceName: "url_content")
}else if (self.ContentLabel.text?.contains("exe"))!{
imageData.image = #imageLiteral(resourceName: "application_content")
}else if (self.ContentLabel.text?.contains("doc"))!{
imageData.image = #imageLiteral(resourceName: "word_content")
}else if (self.ContentLabel.text?.contains("bat"))!{
imageData.image = #imageLiteral(resourceName: "cmd")
}
else if (self.ContentLabel.text?.contains("lnk"))!{
imageData.image = #imageLiteral(resourceName: "cmd")
}
else if ((self.ContentLabel.text?.contains("png"))! || (self.ContentLabel.text?.contains("jpg"))! || (self.ContentLabel.text?.contains("jpeg"))! || (self.ContentLabel.text?.contains("psd"))! || (self.ContentLabel.text?.contains("tiff"))! || (self.ContentLabel.text?.contains("gif"))!) {
imageData.image = #imageLiteral(resourceName: "img")
}else{
imageData.image = nil
}
}
I have added prepareForReuse()method in tableview cell class but still result is same content is changed after scroll.我在 tableview 单元格类中添加了 prepareForReuse() 方法,但结果仍然是滚动后更改了相同的内容。
override func prepareForReuse() {
super.prepareForReuse()
// Clear all content based views and their actions here
imageData.image = nil
ContentLabel.text = ""
}
You have to update the listOfSelectedFolder
array in switchChanged
.你必须更新listOfSelectedFolder
数组switchChanged
。
Assuming self.data
will be declared as non-optional change the method to假设self.data
将被声明为非可选将方法更改为
@objc func switchChanged(_ sender : UISwitch){
let folderName = self.data[sender.tag]
if sender.isOn {
listOfSelectedFolder.append(folderName)
self.delegate?.selectedSubFolder(name: folderName)
} else {
if let index = listOfSelectedFolder.index(of: folderName) {
listOfSelectedFolder.remove(at: index)
}
self.delegate?.deleteFilesFromFolder(folderName: folderName)
}
}
The other methods can be optimized其他方法可以优化
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.data.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let folderName = self.data[indexPath.row]
cell.textLabel?.text = folderName
let switchView = UISwitch(frame: .zero)
switchView.setOn(self.isFolderAdded(folderName: folderName), animated: true)
switchView.tag = indexPath.row // for detect which row switch Changed
switchView.addTarget(self, action: #selector(switchChanged), for: .valueChanged)
cell.accessoryView = switchView
return cell
}
func isFolderAdded(folderName: String) -> Bool{
return listOfSelectedFolder.contains(folderName)
}
However it's highly recommended to use a custom struct as data model and add a isSelected
property.但是强烈建议使用自定义结构作为数据模型并添加isSelected
属性。 And declare listOfSelectedFolder
as a Set.并将listOfSelectedFolder
声明为一个集合。
Put this in your cell class把它放在你的单元格类中
override func prepareForReuse() {
super.prepareForReuse()
// Clear all content based views and their actions here
}
I also experienced the same issue before and I tried to add layoutIfNeeded() inside the cellForRowAt and it solved the problem.我之前也遇到过同样的问题,我尝试在 cellForRowAt 中添加 layoutIfNeeded() 并解决了问题。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
if let _ = cell {} else {
cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
}
if let d = self.data {
cell?.textLabel?.text = d[indexPath.row]
let switchView = UISwitch(frame: .zero)
switchView.setOn(self.isFolderIsAdded(folderName: d[indexPath.row]), animated: true)
switchView.tag = indexPath.row // for detect which row switch Changed
switchView.addTarget(self, action: #selector(self.switchChanged(_:)), for: .valueChanged)
cell?.accessoryView = switchView
cell?.layoutIfNeeded() <--- Add this
}
return cell!
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.