Ios 在didSelectRowAtIndexPath中设置NSLayoutConstraint动画不';行不通
我有一个MainVC(Ios 在didSelectRowAtIndexPath中设置NSLayoutConstraint动画不';行不通,ios,swift,uitableview,delegates,Ios,Swift,Uitableview,Delegates,我有一个MainVC(UIViewController)和一个MainTableVC(UITableView)和另一个嵌套的子表vc(UITableView)。 它们都有MainVC作为其委托和数据源,而且每个都有自己的恢复标识符,因此在调用委托或数据源函数时可以区分它们 下面是一个例子: func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { switch tabl
UIViewController
)和一个MainTableVC(UITableView
)和另一个嵌套的子表vc(UITableView
)。它们都有MainVC作为其
委托
和数据源
,而且每个都有自己的恢复标识符
,因此在调用委托或数据源函数时可以区分它们
下面是一个例子:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch tableView.restorationIdentifier {
case "MainTableVCID":
return 10
case "SubTableVC":
return 5
default:
return 0
}
}
这真是太好了。但有一个问题我无法解决:
我有一个UIPickerView,它是MainVC视图的子视图,它被约束在MainVC视图的正下方,约束如下:
private let pickerView: UIPickerView = {
let picker = UIPickerView()
picker.backgroundColor = UIColor.lightGray
picker.translatesAutoresizingMaskIntoConstraints = false
return picker
}()
private var pickerViewBottomAnchor: NSLayoutConstraint?
override func viewDidLoad() {
super.viewDidLoad()
//other init code..
view.addSubview(pickerView)
pickerView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
pickerView.heightAnchor.constraint(equalToConstant: 180).isActive = true
pickerViewBottomAnchor = pickerView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 180)
pickerViewBottomAnchor?.isActive = true
pickerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
}
在嵌套的tableView(SubTableVC)中,在tableView:didSelectRowatineXpath:
中,我想将NSLayoutConstraint的常量设置为等于零。但是,此时,当我使用控制台打印对象(po self.pickerViewBottomAnchor?.constant)
//打印nil时,我得到了pickerViewBottomAnchor=nil
以下是我使用的代码:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if tableView.restorationIdentifier == "SubTableVC" {
pickerViewBottomAnchor?.constant = 180
self.view.layoutIfNeeded()
}
}
首先将您的didSelectRowAt
功能更改为:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if pickerViewBottomAnchor?.constant != 0 {
pickerViewBottomAnchor?.constant = 0
} else {
pickerViewBottomAnchor?.constant = 180
}
UIView.animate(withDuration: 0.5) {
self.view.layoutIfNeeded()
}
}
使用该选项,在任一表中选择一行时,应交替向上或向下滑动选择器视图
如果这不起任何作用,那么您(可能)没有正确设置表视图.delegate
属性
如果/当该功能正常工作时,请编辑该函数,使其仅在您在子表视图上选择了一行时才起作用。是否可以发布更多代码?从你们所展示的来看,并没有什么是“零”的原因。此外,底部常数为180的选择器将超出范围。这就是你想要的吗?@yerpy是的,我希望它超出范围,当用户单击单元格时,didSelectItemAtIndexPath
,我希望底部的常量为0。关于nil的情况,当我使用主tableView在类本身内部的任何其他函数中更改底部常量时,它不会返回nil。创建pickerView
的代码在哪里?您是否正在设置.translatesAutoResizengMacSkintoConstraints=false
?@DonMag是的,我已经更新了问题。好的-如果您使用pickerViewBottomAnchor?.constant=0
,是否会出现picker视图?谢谢@DonMag,我发现我正在创建一个结构来保存一些常量,其中一个是主VC,例如:let mainvcdegate=MainVC()
,因此SubTableVC.delegate=MyStruct.mainvcdegate
正在将委托设置为MainVC的新实例。解决方案是在MainVC的viewDidLoad()
中添加MyStruct.mainvcdegate=self
。再次感谢。