我有一个NSDatePicker (NSDatePicker* datePicker)
,并将其委托设置为主应用程序(self
)。我编程如下。
制作self
datePicker委托
[[datePicker cell] setDelegate:self];
设置datePickerAction:
以在单击控件时调用。
[datePicker setAction:@selector(datePickerAction:)];
这是方法。
- (IBAction)datePickerAction:(id)sender
{
if( [[[NSApplication sharedApplication] currentEvent] modifierFlags] &
NSShiftKeyMask )
NSLog(@"shift pressed %@", [datePicker dateValue]);
else
NSLog(@"hello %@", [datePicker dateValue]);
}
问题是当我点击NSDatePicker日历中的日期时,委派似乎不起作用。
答案 0 :(得分:3)
您必须将此方法添加到您的代码中:
- (void)datePickerCell:(NSDatePickerCell *)aDatePickerCell validateProposedDateValue:(NSDate **)proposedDateValue timeInterval:(NSTimeInterval *)proposedTimeInterval
{
NSString *aDate = [myDateFormat stringFromDate:*proposedDateValue];
}
从IB中选择DatePickerCell,右键单击,将委托条目拖到文件所有者框中。
答案 1 :(得分:2)
NSDatePicker的委托行为意外。有人可能会认为成为NSDatePicker的委托意味着您将从NSControl,NSDatePicker的父类接收通知事件。
但事实并非如此。委托在NSDatePicker的单元格上设置,因此您的委托类将从单元格(符合NSDatePickerCellDelegate协议)接收事件,而不是控件。这些细胞委托方法中只有一种是验证方法。
你可以跳过子类化NSDatePicker的循环并在控件上进行委托,但是你失去了验证委托,视图层次结构的其他部分似乎依赖于它。我怀疑在这种情况下,目标/操作方法或使用绑定是拦截用户交互的唯一方法。
答案 2 :(得分:0)
您需要继承NSDatePicker并覆盖MouseDown事件并将其连接到委托。这是代码。
<强> CustomDatePick.h 强>
#import <Cocoa/Cocoa.h>
@protocol CustomPickerDelegate
- (void)didPickerClick;
@end
@interface CustomDatePicker : NSDatePicker
@property (assign) id <CustomPickerDelegate> myDelegate;
@end
<强> CustomDatePick.m 强>
#import "CustomDatePicker.h"
@implementation CustomDatePicker
- (void)mouseDown:(NSEvent *)event {
[super mouseDown:event];
[self.myDelegate didPickerClick];
}
@end
答案 3 :(得分:-4)
设置NSDatePicker
本身的代理而不是其单元格:
[datePicker setDelegate:self]