0

Objective-C では、NSTextField を作成しようとしています。クリックすると、テキスト フィールドの下にスライドする NSDatePicker を含むシートが開きます。シートを閉じる日付を選択し、選択した日付を NSTextField に入力します。

プロトコルを使用して Swift でこれを行う方法に関するこの記事を見つけました。 http://www.knowstack.com/swift-nsdatepicker-sample-code/#comment-20440

しかし、それを Objective-C に変換すると、いくつかの問題が発生します。

ボタンをクリックしてシートをトリガーすると、イベントを無視してシートが画面の中央に表示されます。

-(NSRect)window:(NSWindow *)window willPositionSheet:(NSWindow *)sheet usingRect:(NSRect)rect {

日付を選択すると、メインの xib のテキスト フィールドが選択内容で更新されるため、プロトコル部分は機能しますが、シートは画面上で応答しません。

ボタンをもう一度クリックすると、応答しないシートが閉じて NSTextField の下に再表示され、日付を選択すると自動的に閉じます。これは予期される動作です。

私の質問は、ボタンを最初にクリックしたときにこれが機能せず、2 回目にしか機能しないのはなぜですか?

コードは次のとおりです。

#import <Cocoa/Cocoa.h>


@protocol DatePickerProtocol
@required
    -(void) selectedDate:(NSDate *)date;
@optional
@end


@interface datePickerWindowController : NSWindowController {
    id delegate;
}

-(void)setDelegate:(id)newDelegate;

@end

#import "datePickerWindowController.h"


@interface datePickerWindowController ()
    @property (weak) IBOutlet NSDatePicker *datePicker;
@end

@implementation datePickerWindowController

- (void)windowDidLoad {
    [super windowDidLoad];

    self.datePicker.dateValue = [NSDate date];
}

-(void)setDelegate:(id)newDelegate {
    delegate = newDelegate;
    NSLog(@"delegate has been set in datePickerWindowController");
}


- (IBAction)selectDate:(NSDatePicker *)sender {
    [delegate selectedDate:self.datePicker.dateValue];
    [self.window close];
}

@end

#import <Cocoa/Cocoa.h>
#import "datePickerWindowController.h"


@interface AppDelegate : NSObject <NSApplicationDelegate, DatePickerProtocol, NSWindowDelegate>

@end

#import "AppDelegate.h"

@interface AppDelegate ()
    @property (weak) IBOutlet NSWindow *window;
    @property (weak) IBOutlet NSDatePicker *timePicker;
    @property (weak) IBOutlet NSTextField *textDate;
    @property (retain) datePickerWindowController * myDatePickerWindowController;
@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    self.window.delegate = self;
    [self.window setDelegate:self];

    self.textDate.stringValue = [NSString stringWithFormat:@"%@",[NSDate date]];

    datePickerWindowController * windowController = [[datePickerWindowController alloc] initWithWindowNibName:@"datePickerWindowController"];


    self.myDatePickerWindowController = windowController;
    self.myDatePickerWindowController.delegate = self;
    [self.myDatePickerWindowController setDelegate:self];
}


- (void)applicationWillTerminate:(NSNotification *)aNotification {
}

-(void)selectedDate:(NSDate *)date {
    self.textDate.stringValue = [NSString stringWithFormat:@"%@", date];

}

- (IBAction)pickDateButton:(NSButton *)sender {

    [self.window beginSheet:self.myDatePickerWindowController.window completionHandler:nil];
}

// Position sheet under text field
-(NSRect)window:(NSWindow *)window willPositionSheet:(NSWindow *)sheet usingRect:(NSRect)rect {
    if (sheet == self.myDatePickerWindowController.window) {
        NSRect r = self.textDate.frame;
        r.origin.y = r.origin.y + 5;
        return r;
    } else {
        return rect;
    }
}

@end

どういうわけかデリゲートを台無しにしていると思います。多分xibまたはコードにあります。なぜそれが2回目に機能するのかわかりません。これは保持によるものですか、それとも DatePicker を維持する方法によるものですか。

助けてくれてありがとう。

4

0 に答える 0