我有一个在每个UITableViewCell中都有UISegmentedControls的应用程序,它看起来像这样:
https://i.stack.imgur.com/ezMUJ.png
对于用户选择"是"的每一行。选项,我想打印行的索引。
在这种情况下,第一步是在UISegmentedControl上使用addTarget,以指定处理Segmented Control操作的函数。但是,由于我使用的是自定义分段控件,因此addTarget不可用(回调和委派是将信息传递到分段控件的唯一方法)。
我的第一个问题是,有没有办法在回调中调用方法? 我的第二个问题是,是否有更简单的方法来做到这一点?有些人建议在单元和视图控制器之间传输数据的协议和委托,但我不确定如何做到这一点或者它是合适的。
这是我到目前为止的代码:
导入UIKit
class MyTableViewController:UITableViewController {
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 150
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return 10
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath)
cell.backgroundColor = .green
return cell
}
func printCellIndexPath(cell: UITableViewCell){
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(MyCell.self, forCellReuseIdentifier: "cellId")
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
类MyCell:UITableViewCell {
var myTableViewController: MyTableViewController?
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupViews()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
let nameLabel: UILabel = {
let label = UILabel()
label.text = "Sample Item"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
let actionButton = YSSegmentedControl(
frame: CGRect.zero,
titles: [
"Yes",
"No"
],
action: {
control, index in
if index == 1 {
print ("tapped")
}
else{
}
})
func setupViews(){
addSubview(nameLabel)
addSubview(actionButton)
actionButton.translatesAutoresizingMaskIntoConstraints = false
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[v0]-160-[v1]-16-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": nameLabel, "v1": actionButton]));
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": nameLabel]))
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-60-[v0]-60-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": actionButton]))
}
}
MyCell是我的自定义单元格类,actionButton是每个单元格中存在的UISegmentedControl。
答案 0 :(得分:0)
要删除委托和回调,为什么不在cellForrowatIndexpath方法中生成YSSegmentedControl,并且你将标签传递给YSSegmentedControl对象,就像那样
actionButton.tag = indexpath.row
当你点击任何片段时,你将在YSSegmentedControl委托中得到回调
func segmentedControl(_ segmentedControl:YSSegmentedControl, willPressItemAt index:Int){ print("(segmentedControl.tag)" +"(index)") }
func segmentedControl(_ segmentedControl: YSSegmentedControl, didPressItemAt index: Int){ }
从这些委托方法中,你将获得YSSegmentedControl行 segmentedControl.tag 以及索引的特定按钮索引