我有一个简单的cocoa应用程序,其中一个表视图显示了一些条目。我希望用户只需在表格中选择并按“删除”即可删除他想要的任何条目。如何检测“删除”的按键,以及当用户在tableview中选择一个条目时如何知道它是否出现?
**编辑:如果我没说清楚,“删除”是指mac键盘上的退格键,而不是GUI按钮。
答案 0 :(得分:3)
对表视图进行子类化,并在按下删除时让它发送其委托事件。
<强> MyTableView.h:强>
@interface MyTableView : NSTableView
@end
@protocol MyTableViewDelegate <NSTableViewDelegate>
-(BOOL)deleteKeyPressedForTableView:(MyTableView *)tableView;
@end
<强> MyTableView.m:强>
+(unichar)firstCharPressedForEvent:(NSEvent *)theEvent {
if (![[theEvent characters] length]) return -1;
return [[theEvent characters] characterAtIndex:0];
}
+(BOOL)eventIsDeleteKeyPressed:(NSEvent *)theEvent {
switch ([MyTableView firstCharPressedForEvent:theEvent]) {
case NSDeleteFunctionKey:
case NSDeleteCharFunctionKey:
case NSDeleteCharacter:
return YES;
default:
return NO;
}
}
-(void)keyDown:(NSEvent *)theEvent {
if ([MyTableView eventIsDeleteKeyPressed:theEvent])
if ([[self delegate] respondsToSelector:@selector(deleteKeyPressedForTableView:)])
if ([(id<MyTableViewDelegate>)[self delegate] deleteKeyPressedForTableView:self])
return;
// The delegate wasn't able to handle it
[super keyDown:theEvent];
}
表格视图的委托:
- (BOOL)deleteKeyPressedForTableView:(MyTableView *)tableView {
// check if row is selected
if (no_row_selected) return NO;
// handle deletion
if (error_condition) return NO;
return YES;
}
答案 1 :(得分:1)
另一种选择是只将等效键(键盘快捷键)指定给“编辑”菜单的“删除”项,并将其操作设置为控制器的delete:
方法。
答案 2 :(得分:0)
如果您只有一个表,更简单的解决方案是在窗口控制器或视图控制器中实现一些NSResponder
方法:
- (void)keyDown:(NSEvent *)event
{
[self interpretKeyEvents:@[event]];
}
- (void)deleteBackward:(id)sender
{
// use the tableView's selectedRow to determine what/if to delete
}
答案 3 :(得分:0)
这是@paulmelnikow给出的答案的Swift 4版本。
protocol MyTableViewDelegate: NSTableViewDelegate {
func deleteKeyPressed(for tableView: MyTableView)
}
class MyTableView: NSTableView {
override func keyDown(with event: NSEvent) {
guard let myDelegate = delegate as? MyTableViewDelegate, deletePressed(event: event) else {
super.keyDown(with: event)
return
}
myDelegate.deleteKeyPressed(for: self)
}
fileprivate func deletePressed(event: NSEvent) -> Bool {
guard let firstChar = event.characters?.first, let uniScalar = firstChar.unicodeScalars.first else {
return false
}
let char = Int(uniScalar.value)
switch char {
case NSDeleteFunctionKey, NSDeleteCharFunctionKey, NSDeleteCharacter:
return true
default:
return false
}
}
}