1

Как отменить выбор NSCollectionViewItem, щелкнув по нему еще раз?Отмените выбор NSCollectionViewItem, щелкнув по нему

Это код, который я использую для выбора и отменив:

func collectionView(collectionView: NSCollectionView, didSelectItemsAtIndexPaths indexPaths: Set<NSIndexPath>) { 
     print("selected") 
     guard let indexPath = indexPaths.first else {return} 
     print("selected 2") 
     guard let item = collectionView.itemAtIndexPath(indexPath) else {return} 
     print("selected 3") 
     (item as! CollectionViewItem).setHighlight(true) 
    } 

    func collectionView(collectionView: NSCollectionView, didDeselectItemsAtIndexPaths indexPaths: Set<NSIndexPath>) { 
     print("deselect") 
     guard let indexPath = indexPaths.first else {return} 
     print("deselect 2") 
     guard let item = collectionView.itemAtIndexPath(indexPath) else {return} 
     print("deselect 3") 
     (item as! CollectionViewItem).setHighlight(false) 
    } 

///////////////////// 

    class CollectionViewItem: NSCollectionViewItem { 


     func setHighlight(selected: Bool) { 

      print("high") 
      view.layer?.borderWidth = selected ? 5.0 : 0.0 
      view.layer?.backgroundColor = selected ? NSColor.redColor().CGColor : NSColor(calibratedRed: 204.0/255, green: 207.0/255, blue: 1, alpha: 1).CGColor 
     } 
    } 

Этот код deslect, когда другой элемент щелкнул, но не тогда, когда тот же элемент. Я хочу, чтобы удалить, когда один и тот же элемент нажата.

ответ

0

Один простой трюк - использовать CMD - щелчок левой кнопкой мыши. Хотя это точно не решает мою проблему, оно все же лучше, чем ничего.

0

Вы можете достичь этого, наблюдая за выбранным состоянием объекта и устанавливая NSClickGestureRecognizer на вид элемента, когда он выбран, и удалите его, когда он не выбран.

Поместите следующий код где-то в вашем NSCollectionViewItem подкласса:

- (void)onClick:(NSGestureRecognizer *)sender { 
    if (self.selected) { 
     //here you can deselect this specific item, this just deselects all 
     [self.collectionView deselectAll:nil]; 
    } 
} 

- (void)setSelected:(BOOL)selected { 
    [super setSelected:selected]; 
    if (selected) { 
     [self installGestureRecognizer]; 
    } 
    else { 
     [self uninstallGestureRecognizer]; 
    } 
} 

- (void)installGestureRecognizer { 
    [self uninstallGestureRecognizer]; 

    self.clickGestureRecognizer = [[NSClickGestureRecognizer alloc] initWithTarget:self 
                      action:@selector(onClick:)]; 
    [self.view addGestureRecognizer:self.clickGestureRecognizer]; 
} 

- (void)uninstallGestureRecognizer { 
    [self.view removeGestureRecognizer:self.clickGestureRecognizer]; 
    self.clickGestureRecognizer = nil; 
}