Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITableView自定义单元格按钮从主视图中选择其他按钮?_Ios_Swift_Uitableview_Uibutton_Tableview - Fatal编程技术网

Ios UITableView自定义单元格按钮从主视图中选择其他按钮?

Ios UITableView自定义单元格按钮从主视图中选择其他按钮?,ios,swift,uitableview,uibutton,tableview,Ios,Swift,Uitableview,Uibutton,Tableview,在我的自定义tableviewcell上,我有一个按钮,用户可以按下该按钮,在选定和未选定之间切换。这只是一个简单的UIButton,这个按钮包含在我的customtableviewcell中作为一个出口 import UIKit class CustomCellAssessment: UITableViewCell { @IBOutlet weak var name: UILabel! @IBOutlet weak var dateTaken: UILabel! @IBOutlet wea

在我的自定义tableviewcell上,我有一个按钮,用户可以按下该按钮,在选定和未选定之间切换。这只是一个简单的UIButton,这个按钮包含在我的customtableviewcell中作为一个出口

import UIKit

class CustomCellAssessment: UITableViewCell {

@IBOutlet weak var name: UILabel!
@IBOutlet weak var dateTaken: UILabel!
@IBOutlet weak var id: UILabel!
@IBOutlet weak var score: UILabel!
@IBOutlet weak var button: UIButton!


override func awakeFromNib() {
     super.awakeFromNib()
    // Initialization code
}

 override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)


    // Configure the view for the selected state
}

@IBAction func selectButton(_ sender: UIButton) {

if sender.isSelected{

  sender.isSelected = false

}else{
  sender.isSelected = true
} 
} 
}
奇怪的是,当我按下第一个单元格上的按钮时,它会在同一个tableview中的另一个单元格(视图外)上选择一个向下8个单元格的按钮。每个单元格都有自己的按钮,但似乎使用dequeReusableCell导致系统以这种方式运行。为什么要这样做?这与UIbuttons在tableviewcells上的工作方式有关吗


谢谢

当您点击按钮时,您正在设置按钮的选定状态。当单元格被重用时,按钮仍然处于选中状态-您没有做任何重置或更新该状态的操作

如果按钮选择与表格单元格选择是分开的,那么您需要跟踪所选按钮的索引路径,作为数据模型的一部分,然后在
表格视图(u:cellForRowAt:)
中更新按钮的所选状态

一个表视图只会创建它所需要的数量的单元格来显示一个屏幕和一个位的信息。之后,细胞被重复使用。如果单元格从屏幕顶部滚动,则表视图会将其放入重用队列中,然后当您滚动时需要在底部显示新行时,它会将其从队列中拉出,并在
表视图(u:cellForRowAt:)
中提供给您


您在这里得到的单元格将与之前使用的8行左右的单元格完全相同,完全由您来配置。您可以在
cellForRow
中执行此操作,并且您还可以通过实现
prepareForReuse
在单元格出列之前调用,从而在单元格本身中获得机会

点击按钮时,您正在设置按钮的选定状态。当单元格被重用时,按钮仍然处于选中状态-您没有做任何重置或更新该状态的操作

如果按钮选择与表格单元格选择是分开的,那么您需要跟踪所选按钮的索引路径,作为数据模型的一部分,然后在
表格视图(u:cellForRowAt:)
中更新按钮的所选状态

一个表视图只会创建它所需要的数量的单元格来显示一个屏幕和一个位的信息。之后,细胞被重复使用。如果单元格从屏幕顶部滚动,则表视图会将其放入重用队列中,然后当您滚动时需要在底部显示新行时,它会将其从队列中拉出,并在
表视图(u:cellForRowAt:)
中提供给您

您在这里得到的单元格将与之前使用的8行左右的单元格完全相同,完全由您来配置。您可以在
cellForRow
中执行此操作,并且您还可以通过实现
prepareForReuse
在单元格出列之前调用,从而在单元格本身中获得机会

每个单元格都有自己的按钮,但似乎使用dequeReusableCell导致系统以这种方式运行

错。UITableViewCells是可重用的,因此,如果tableView有8个可见单元格,则在加载第9个单元格时,将重用单元格nr 1

解决方案:您需要跟踪单元格的状态。调用方法
cellforrowatinexpath
时,需要从头配置单元格

您的ViewController中可以有一个包含单元格状态的小数组:

var cellsState: [CellState]
并将每个索引的选定状态存储在那里。然后在cellForRowAtIndexPath中,使用状态配置单元格

cell.selected = self.cellsState[indexPath.row].selected
因此,我要做的概述是:

1-在
单元格中,我将设置

cell.button.tag = indexPath.row
cell.selected = cellsState[indexPath.row].selected
2-将iAction移动到ViewController或TableViewController

3-调用click方法时,更新单元格的选定状态

self.cellsState[sender.tag].selected = true
请记住始终在
cellforrowatinexpath

func selectedButton(sender: UIButton){
       let hitPoint: CGPoint = sender.convert(CGPoint.zero, to: self.tableView)
       let indexPath: NSIndexPath = self.tableView.indexPathForRow(at: hitPoint)! as NSIndexPath
}
编辑:

每个单元格都有自己的按钮,但似乎使用dequeReusableCell导致系统以这种方式运行

错。UITableViewCells是可重用的,因此,如果tableView有8个可见单元格,则在加载第9个单元格时,将重用单元格nr 1

解决方案:您需要跟踪单元格的状态。调用方法
cellforrowatinexpath
时,需要从头配置单元格

您的ViewController中可以有一个包含单元格状态的小数组:

var cellsState: [CellState]
并将每个索引的选定状态存储在那里。然后在cellForRowAtIndexPath中,使用状态配置单元格

cell.selected = self.cellsState[indexPath.row].selected
因此,我要做的概述是:

1-在
单元格中,我将设置

cell.button.tag = indexPath.row
cell.selected = cellsState[indexPath.row].selected
2-将iAction移动到ViewController或TableViewController

3-调用click方法时,更新单元格的选定状态

self.cellsState[sender.tag].selected = true
请记住始终在
cellforrowatinexpath

func selectedButton(sender: UIButton){
       let hitPoint: CGPoint = sender.convert(CGPoint.zero, to: self.tableView)
       let indexPath: NSIndexPath = self.tableView.indexPathForRow(at: hitPoint)! as NSIndexPath
}
编辑:

在您的
表视图(uux0:cellForRowAt:)
对按钮单击采取操作并添加目标

cell.button.addTarget(self, action: #selector(self.selectedButton), for: .touchUpInside)
在目标方法中,使用以下行获取
indexPath

func selectedButton(sender: UIButton){
       let hitPoint: CGPoint = sender.convert(CGPoint.zero, to: self.tableView)
       let indexPath: NSIndexPath = self.tableView.indexPathForRow(at: hitPoint)! as NSIndexPath
}
然后使用
indepath
完成您的工作。 实际上,您的方法找不到单击了哪个
indepath
按钮,这就是为什么您不使用所需按钮的原因。

表视图(u:cellForRowAt:)
对按钮单击采取操作并添加目标

cell.button.addTarget(self, action: #selector(self.selectedButton), for: .touchUpInside)
在目标方法中,使用以下行获取
indexPath

func selectedButton(sender: UIButton){
       let hitPoint: CGPoint = sender.convert(CGPoint.zero, to: self.tableView)
       let indexPath: NSIndexPath = self.tableView.indexPathForRow(at: hitPoint)! as NSIndexPath
}
然后使用
indepath
完成您的工作。
实际上,您的方法无法找到单击了哪个
indepath
按钮,这就是为什么不使用所需按钮的原因。

解决问题的一种方法如下

1。弗斯特