我的目标是显示一个集合视图单元格,如果点击它,它将打开一个新的视图控制器(MovieDetailA)。或者,如果长按,请打开一个弹出菜单(MovieDetailB)。
我的项目设置方式是XIBS。我的集合视图分解如下:
- MovieCollectionViewCell.swift - (cell)
- MovieCollectionViewController - (单元格的功能)
- MovieMain.swift - (显示集合视图)。
醇>
当用户点击单元格时,我的集合视图正常工作,MovieDetailA正常工作。我正在使用NSNotifications
和NotificationCenter.default.addObserver
进行操作。
我的问题是我无法弄清楚如何将通知应用于UILongPressGesture
。我已经发布了MovieMain.swift的代码,并将其编辑为仅关注上述问题。
override func viewDidLoad() {
super.viewDidLoad()
let gesture = UILongPressGestureRecognizer(target:self,
action:#selector(movieSelected(notification:)))
gesture.minimumPressDuration = 0.5
gesture.delaysTouchesBegan = true
collectionView.addGestureRecognizer(gesture)
}
override func addObservers() {
super.addObservers()
NotificationCenter.default.addObserver(self, selector: #selector(movieSelected(notification:)), name:
NOTIF_MOVIE_SELECTED, object: nil) }
@objc func movieSelected(notification: NSNotification) {
guard let movie = notification.object as? Movie else { -- I think error is coming from this line.
return
} }
运行应用后,我收到以下错误,
由于未捕获的异常而终止应用 'NSInvalidArgumentException',原因:' - [UILongPressGestureRecognizer object]:无法识别的选择器发送到实例
答案 0 :(得分:0)
问题是您使用方法movieSelected(notification:)
作为长按
let gesture = UILongPressGestureRecognizer(target:self,
action:#selector(movieSelected(notification:)))
并在此行中
guard let movie = notification.object
你问notification
类型为UILongPressGestureRecognizer
的{{1}}肯定不存在,因此崩溃
该方法适用于此通知
object
要实现目标,您必须将长按添加到 NotificationCenter.default.addObserver(self, selector: #selector(movieSelected(notification:)), name:
并在此方法中发布通知
awakeFromNib
并且根据包含collectionView的VC中的观察者,您将获得单元格本身并询问它是否在弹出窗口中显示当前模型