我想添加在表视图中编辑特定列时使用日期选择器的功能,并使用
here中的代码片段,该代码片段运行良好.然而,NSDatePicker不适合我的需要,所以我使用自己的自定义视图,使用IB创建并通过NSViewController子类加载来编辑日期.
但是,我不知道如何以接受编辑的方式关闭弹出式菜单,即在userAcceptedEdit中返回YES:
BOOL userAcceptedEdit = [menu popUpMenuPositioningItem:nil atLocation:frame.origin inView:tableView];
当NSDatePicker是菜单的视图,但不是与我的自定义视图,这是正常工作.
我在自定义视图中捕获文本字段中的输入键操作,但我可以想出的是如何取消菜单跟踪,这使得userAcceptedEdit == NO:
MyCustomViewController.mm:
- (IBAction)textFieldAction:(id)sender { logdbg(@"Action"); NSMenu* menu = [[self.view enclosingMenuItem] menu]; [menu cancelTracking]; }
苹果应用程序菜单和弹出式列表编程主题的Views in Menu Items部分不包括…
编辑这是a sample project,这说明了这个问题.
有人可以提供一些指导吗?
解决方法
您还应该可以将textFields委托设置为NSViewController,在ViewController中实现NSTextFieldDelegate,并执行此操作
- (void)controlTextDidEndEditing:(NSNotification *)aNotification{ // NSTextField * textField = [aNotification object]; NSUInteger whyEnd = [[[aNotification userInfo] objectForKey:@"NSTextMovement"] unsignedIntValue]; if(whyEnd == NSReturnTextMovement){ // Create new event here using the below routine /* [[self window] keyDown: [NSEvent keyEventWithType:(NSEventType)type location:(NSPoint)location modifierFlags:(NSUInteger)flags timestamp:(NSTimeInterval)time windowNumber:(NSInteger)windowNum context:(NSGraphicsContext *)context characters:(NSString *)characters charactersIgnoringModifiers:(NSString *)unmodCharacters isARepeat:(BOOL)repeatKey keyCode:(unsigned short)code] ]; */ } }
在这里,您通过创建一个新事件传递给父视图,基本上将通知转换为EVENT
还应该注意到,这成为所有文本区域的中央“派遣”返回捕手.
以下是使用NSEvent创建方法的很好的链接:
http://advinprog.blogspot.com/2008/06/so-you-want-to-post-keyboard-event-in.html
注意在这个写法如何模拟一个key_down和一个key_up!