Một cách tiếp cận mà tôi đã sử dụng là không cố gắng áp dụng các thao tác menu theo ngữ cảnh cho một mục cụ thể được nhấp vào nhưng đối với các mục đã chọn. Và tôi làm cho mục được nhấp vào tự thêm vào vùng chọn.
Tôi đã sử dụng chế độ xem tùy chỉnh cho chế độ xem mục bộ sưu tập. Lớp chế độ xem tùy chỉnh có một lối thoát, item
, với mục xem bộ sưu tập của riêng mình, mà tôi kết nối trong NIB. Nó cũng ghi đè -rightMouseDown:
có mục thêm bản thân để lựa chọn:
- (void) rightMouseDown:(NSEvent*)event
{
NSCollectionView* parent = self.item.collectionView;
NSUInteger index = NSNotFound;
NSUInteger count = parent.content.count;
for (NSUInteger i = 0; i < count; i++)
{
if ([parent itemAtIndex:i] == self.item)
{
index = i;
break;
}
}
NSMutableIndexSet* selectionIndexes = [[parent.selectionIndexes mutableCopy] autorelease];
if (index != NSNotFound && ![selectionIndexes containsIndex:index])
{
[selectionIndexes addIndex:index];
parent.selectionIndexes = selectionIndexes;
}
return [super rightMouseDown:event];
}
Nếu bạn thích, chứ không phải thêm mục vào việc lựa chọn, bạn có thể kiểm tra xem nó đã có trong vùng chọn. Nếu có, đừng sửa đổi lựa chọn. Nếu không, thay thế lựa chọn chỉ với mục (làm cho nó là mục được chọn duy nhất).
Hoặc, bạn có thể đặt menu ngữ cảnh trên các chế độ xem mục thay vì trên chế độ xem bộ sưu tập. Sau đó, các mục menu có thể nhắm mục tiêu chế độ xem mục hoặc mục xem bộ sưu tập.
Cuối cùng, bạn có thể phân lớp NSCollectionView
và ghi đè -menuForEvent:
. Bạn vẫn sẽ gọi tới số super
và trả lại menu nó trả về, nhưng bạn có thể nhân cơ hội này để ghi lại sự kiện và/hoặc mục tại vị trí của nó. Để xác định điều đó, bạn muốn làm điều gì đó như:
- (NSMenu*) menuForEvent:(NSEvent*)event
{
_clickedItemIndex = NSNotFound;
NSPoint point = [self convertPoint:event.locationInWindow fromView:nil];
NSUInteger count = self.content.count;
for (NSUInteger i = 0; i < count; i++)
{
NSRect itemFrame = [self frameForItemAtIndex:i];
if (NSMouseInRect(point, itemFrame, self.isFlipped))
{
_clickedItemIndex = i;
break;
}
}
return [super menuForEvent:event];
}
Nguồn
2014-10-01 05:49:48
đẹp !!! Cảm ơn bạn rất nhiều! –
Đó là cách quá phức tạp. Bạn đã thử đặt cửa sổ trình đơn của chế độ xem bộ sưu tập của mình thành menu từ tệp nib của bạn chưa? Đặt đối tượng bộ điều khiển của bạn làm đại biểu cho menu. Mỗi khi menu được gọi, hãy cập nhật menu của bạn theo lựa chọn trong giao diện bộ sưu tập. – iljawascoding
Tôi thực sự thích cách tiếp cận phân lớp 'NSCollectionView' - mang lại sự nhất quán tốt về hành vi với' NSTableView'. –