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 を維持する方法によるものですか。
助けてくれてありがとう。