具有CollectionViewCell和UILongPressGesture错误的XIB

时间:2018-03-10 01:35:13

标签: ios swift uicollectionview

我的目标是显示一个集合视图单元格,如果点击它,它将打开一个新的视图控制器(MovieDetailA)。或者,如果长按,请打开一个弹出菜单(MovieDetailB)。

我的项目设置方式是XIBS。我的集合视图分解如下:

  
      
  1. MovieCollectionViewCell.swift - (cell)
  2.   
  3. MovieCollectionViewController - (单元格的功能)
  4.   
  5. MovieMain.swift - (显示集合视图)。
  6.   

当用户点击单元格时,我的集合视图正常工作,MovieDetailA正常工作。我正在使用NSNotificationsNotificationCenter.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]:无法识别的选择器发送到实例

1 个答案:

答案 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中的观察者,您将获得单元格本身并询问它是否在弹出窗口中显示当前模型