Настройка делегата NSDatePicker - PullRequest
3 голосов
/ 15 марта 2011

У меня есть NSDatePicker (NSDatePicker* datePicker), и я установил его делегат в качестве основного приложения (self).Я запрограммирован следующим образом.

  1. Сделать self datePicker делегата

    [[datePicker cell] setDelegate:self];

  2. Установить 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.

enter image description here

  • В: Что не так с этим делегированием?Метод target / action работает нормально.
  • Q: Какой документ можно использовать для того, какой метод делегирования поддерживается для NSDatePicker?

Ответы [ 4 ]

3 голосов
/ 10 октября 2013

Вы должны добавить этот метод в свой код:

- (void)datePickerCell:(NSDatePickerCell *)aDatePickerCell validateProposedDateValue:(NSDate **)proposedDateValue timeInterval:(NSTimeInterval *)proposedTimeInterval
{
   NSString *aDate = [myDateFormat stringFromDate:*proposedDateValue];
}

В IB выберите DatePickerCell, щелкните правой кнопкой мыши и перетащите запись делегата в поле «Владелец файла».

2 голосов
/ 04 июня 2011

Делегирование ведет себя неожиданно для NSDatePicker. Можно подумать, что становление делегатом для NSDatePicker означает, что вы будете получать события уведомлений от NSControl, родительского класса NSDatePicker.

Однако это не так. Делегат устанавливается в ячейке NSDatePicker, поэтому ваш класс делегата будет получать события из ячейки (в соответствии с протоколом NSDatePickerCellDelegate), а не элемент управления. Есть только один из этих методов делегата ячейки, метод проверки.

Вы можете перепрыгивать через подклассы NSDatePicker и получать делегирование для элемента управления, но тогда вы теряете делегирование проверки, от которого другие части иерархии представлений зависят. Я подозреваю, что метод target / action или использование привязок - единственный способ перехватить взаимодействие с пользователем в этом случае.

0 голосов
/ 03 сентября 2016

Вам необходимо создать подкласс 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
0 голосов
/ 15 марта 2011

Установите делегата самого NSDatePicker вместо его ячейки:

[datePicker setDelegate:self]

...