我在UITableView
内有一个UICollectionViewCell
,我正在尝试从UITableViewCell
方法内的tableView(_:didSelectRowAt:)
推送新视图。但是,我无法访问navigationController
。我将如何导航到新视图?
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
var item = Item(name: "")
switch indexPath.section {
case 0:
item = array1![indexPath.item]
case 1:
item = array2![indexPath.item]
default:
break
}
let layout = UICollectionViewFlowLayout()
let newView = NewCollectionView(collectionViewLayout: layout)
newView.itemOfInterest = item
// Can't reference navigationController
}
答案 0 :(得分:0)
为此
1。您需要在添加了tableview的collectionviewcell中声明一个协议
2。在添加collectionview的类上实现protocol方法。并点击此处处理导航
3。在调用indexpath方法的collectionviewCellForrow时设置collectionview单元格委托,并在collectionview单元格中单击tableview项时调用委托方法。
答案 1 :(得分:0)
获取当前视图的父控制器-
//MARK: get parent controller...
extension UIView {
var parentViewController: UIViewController? {
var parentResponder: UIResponder? = self
while parentResponder != nil {
parentResponder = parentResponder!.next
if let viewController = parentResponder as? UIViewController {
return viewController
}
}
return nil
}
}
用法:-
以parentViewController?.navigationController
let viewController = GymLearnMoreViewController(nibName: "GymLearnMoreViewController", bundle: nil) //Your View controller instance
parentViewController?.navigationController?.pushViewController(viewController, animated: true)
来源Apple:-
https://developer.apple.com/documentation/uikit/uiresponder/1621099-next https://developer.apple.com/documentation/uikit/uiresponder?changes=_9
答案 2 :(得分:0)
一种方法是使用NotificationCenter
,您可以在ParentViewController
中编写:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(methodNavigate(notification:)), name: NSNotification.Name(rawValue: "NavigateToSecondView"), object: nil)
}
@objc func methodNavigate(notification: NSNotification) {
Write your push segue code here.
}
别忘了删除viewDidDisappear
中的观察者:
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "NavigateToSecondView"), object: nil)
}
您也可以通过它传递数据。
然后进入didSelectRowAt
:
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "NavigateToSecondView"), object: "Send Data Here")
但是我建议使用协议是更好,更优雅的方法。 您可以在互联网上获得很多教程和示例:
希望有帮助。编码愉快。