设置NSDatePicker委托

时间:2011-03-14 22:32:58

标签: objective-c cocoa macos nsdatepicker

我有一个NSDatePicker (NSDatePicker* datePicker),并将其委托设置为主应用程序(self)。我编程如下。

  1. 制作self datePicker委托

    [[datePicker cell] setDelegate:self];

  2. 设置datePickerAction:以在单击控件时调用。

    [datePicker setAction:@selector(datePickerAction:)];

  3. 这是方法。

    - (IBAction)datePickerAction:(id)sender
    {
    
        if( [[[NSApplication sharedApplication] currentEvent] modifierFlags] & 
           NSShiftKeyMask )
            NSLog(@"shift pressed %@", [datePicker dateValue]);
    
        else
            NSLog(@"hello %@", [datePicker dateValue]);
    
    }
    

    问题是当我点击NSDatePicker日历中的日期时,委派似乎不起作用。

    enter image description here

    • 问:这个代表团有什么问题? target/action方法工作正常。
    • 问:我可以使用哪种文档来获取NSDatePicker支持的委派方法?

4 个答案:

答案 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]