在didSelectRowAtIndexPath中动画NSLayoutConstraint不起作用

问题描述:

我有MainTableVC(UITableView)和另一个嵌套SubTableVC(UITableView)的MainVC(UIViewController)。
他们都具有MainVC作为delegatedataSource,而且,每个人都有自己的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 
} 

enter image description here

在嵌套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() 
    } 
} 
+0

行编辑功能,只照着你可以发布更多的代码?从这里你所呈现的没有什么是'零'的原因。此外底部常数= 180的选取器将超出界限。是你想要的吗? – yerpy

+0

@yerpy是的,我希望它是出界,并且当用户点击一个细胞,'didSelectItemAtIndexPath',我想底部常数= 0关于零的情况下,当我改变底部常数在任何其他函数在类中使用主表tableView,它不会返回nil。 – MEnnabah

+0

创建'pickerView'的代码在哪里?你在设置'.translatesAutoresizingMaskIntoConstraints = false'吗? – DonMag

开始改变你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

+0

感谢@DonMag,我想通了,我创建一个结构来保存一些常量,其中一个是MainVC,如:'让mainVCDelegate = MainVC()',所以'SubTableVC.delegate = MyStruct.mainVCDelegate'被设置委托给MainVC的一个新实例。解决方案是在MainVC的viewDidLoad()中添加'MyStruct.mainVCDelegate = self'。再次感谢。 – MEnnabah