在didSelectRowAtIndexPath中动画NSLayoutConstraint不起作用
我有MainTableVC(UITableView
)和另一个嵌套SubTableVC(UITableView
)的MainVC(UIViewController
)。
他们都具有MainVC作为delegate
和dataSource
,而且,每个人都有自己的restorationIdentifier
这样我就可以当我打电话委托或数据源功能区分它们。在didSelectRowAtIndexPath中动画NSLayoutConstraint不起作用
下面是一个例子:
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:didSelectRowAtIndexPath:
我想动画的NSLayoutConstraint的常量等于零。
然而,在这个时候,我得到pickerViewBottomAnchor =零,当我使用控制台打印对象(PO自我。pickerViewBottomAnchor?.constant)//prints 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
属性设置正确。
如果/当做的工作,当你选择在subTableView
感谢@DonMag,我想通了,我创建一个结构来保存一些常量,其中一个是MainVC,如:'让mainVCDelegate = MainVC()',所以'SubTableVC.delegate = MyStruct.mainVCDelegate'被设置委托给MainVC的一个新实例。解决方案是在MainVC的viewDidLoad()中添加'MyStruct.mainVCDelegate = self'。再次感谢。 – MEnnabah
行编辑功能,只照着你可以发布更多的代码?从这里你所呈现的没有什么是'零'的原因。此外底部常数= 180的选取器将超出界限。是你想要的吗? – yerpy
@yerpy是的,我希望它是出界,并且当用户点击一个细胞,'didSelectItemAtIndexPath',我想底部常数= 0关于零的情况下,当我改变底部常数在任何其他函数在类中使用主表tableView,它不会返回nil。 – MEnnabah
创建'pickerView'的代码在哪里?你在设置'.translatesAutoresizingMaskIntoConstraints = false'吗? – DonMag