在didSelectRowAtIndexPath中设置动画NSLayoutConstraint不起作用

时间:2017-08-14 14:26:01

标签: ios swift uitableview delegates

我有一个带有MainTableVC(UIViewController)的MainVC(UITableView)和另一个嵌套的SubTableVC(UITableView)。
它们都有MainVC作为delegatedataSource,每个都有自己的restorationIdentifier所以我可以在调用委托或dataSource函数时区分它们。

以下是一个例子:

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 = nil(po self。pickerViewBottomAnchor?.constant)//prints nil

这是我使用的代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if tableView.restorationIdentifier == "SubTableVC" {
        pickerViewBottomAnchor?.constant = 180
        self.view.layoutIfNeeded()
    }
}

1 个答案:

答案 0 :(得分:1)

首先将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属性。

如果