問題描述
navigationController?.pushViewController 不工作 (navigationController?.pushViewController is not working)
我有一個集合視圖控制器。在 collectionView 單元格 中,我有一個標籤,我可以點擊它來push 到 nextViewController。
我知道 navigationController 中的問題。但我是新來的,所以無法修復。希望你們能幫助我。
這是我的 SceneDelegate:
let layout = UICollectionViewFlowLayout()
// Create the root view controller as needed
let nc = UINavigationController(rootViewController: HomeController(collectionViewLayout: layout))
let win = UIWindow(windowScene: winScene)
win.rootViewController = nc
win.makeKeyAndVisible()
window = win
和我的標籤:
let text = UILabel()
text.text = "something"
text.isUserInteractionEnabled = true
self.addSubview(text)
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(PopularCellTwo.labelTapped))
text.addGestureRecognizer(gestureRecognizer)
}
@objc func labelTapped() {
let nextVC = NextViewController()
self.navigationController?.pushViewController(nextVC, animated: true)
print("labelTapped tapped")
}
我還添加了屏幕截圖。當我點擊“某事”時 它應該進入下一頁。[1]:https://i.stack.imgur.com/4oYwb.png
參考解法
方法 1:
self.navigationController?.pushViewController(nextVC, animated: true)
what self
are you referring to ? because you cant make push in child class you have HomeController i assume its your parent controller .
just try to debug what self
is this could attempt by debugging or debug by condition
print (self)
if (self.isKind(of: YourParentController.self)) {
// make push
}
or try to check , see if navigationcontroller somehow has nil value
方法 2:
Here is how you do it using closures. I've created a closure
parameter in UICollectionViewCell
sub‑class. When the label gesture target is hit I call the closure which then executed the navigation in HomeController
.
class HomeController: UICollectionViewController {
//...
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) ‑> UICollectionViewCell {
let cell = // dequeue cell
cell.labelTap = { [weak self] in
guard let self = self else { return }
let nextVC = NextViewController()
self.navigationController?.pushViewController(nextVC, animated: true)
print("navigated")
}
return cell
}
}
class CollectionViewCell: UICollectionViewCell {
var labelTap: (() ‑> Void)?
@objc func labelTapped() {
print("labelTapped tapped")
labelTap?()
}
}
方法 3:
You can use delegate or closure to do this
class ItemCollectionViewCell: UICollectionViewCell {
var onTapGesture: (() ‑> ())?
}
Then in your function you do
@objc func labelTapped() {
onTapGesture?()
}
And in your controller
class HomeController: UICollectionViewController {
//...
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) ‑> UICollectionViewCell {
let cell = // dequeue cell
cell.onTapGesture = { [unowned self] in
let nextVC = NextViewController()
self.navigationController?.pushViewController(nextVC, animated: true)
}
return cell
}
}
(by Aldiyar、Adli R、Frankenstein、Jawad Ali)