2017-08-14 144 views
0

我有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

回答

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屬性設置正確。

如果/當的工作,當你選擇在subTableView

+0

感謝@DonMag,我想通了,我創建一個結構來保存一些常量,其中一個是MainVC,如:'讓mainVCDelegate = MainVC()',所以'SubTableVC.delegate = MyStruct.mainVCDelegate'被設置委託給MainVC的一個新實例。解決方案是在MainVC的viewDidLoad()中添加'MyStruct.mainVCDelegate = self'。再次感謝。 – MEnnabah