Ios 在didSelectRowAtIndexPath中设置NSLayoutConstraint动画不';行不通

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

我有一个MainVC(
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
。再次感谢。