UIDatePickerの変更を監視するデリゲートがないことに気付きました。ピッカーに変更が加えられたことを、何も確認せずに検出する方法があります。たとえば、新しい番号にスピンして着地した瞬間など、それを検出できます。キーバリューの観察について考えましたが、その場で変化する特性はないと思います
IBに移動し、UIDatePicker
から.hファイルにドラッグします。次に選択
.mファイルで必要に応じてこれを処理します。 XCodeは以下のメソッドを追加します。
日付の変更を処理するには、UIDatePickerにUIControlEventValueChanged
イベントを追加する必要があります。
[myDatePicker addTarget:self action:@selector(dateIsChanged:) forControlEvents:UIControlEventValueChanged];
次に、実装:
- (void)dateIsChanged:(id)sender{
NSLog(@"Date changed");
}
KVO準拠の日付選択ツールの提案を次に示します。
@interface LNKVODatePicker : UIDatePicker
@end
@implementation LNKVODatePicker
- (void)willMoveToWindow:(UIWindow *)newWindow
{
[super willMoveToWindow:newWindow];
[self removeTarget:self action:@selector(_didChangeDate) forControlEvents:UIControlEventValueChanged];
if(newWindow != nil)
{
[self addTarget:self action:@selector(_didChangeDate) forControlEvents:UIControlEventValueChanged];
}
}
- (void)dealloc
{
[self removeTarget:self action:@selector(_didChangeDate) forControlEvents:UIControlEventValueChanged];
}
- (void)_didChangeDate
{
[self willChangeValueForKey:@"date"];
[self didChangeValueForKey:@"date"];
}
@end
Swift 4.2 | Xcode 10.1
@objc func handleDatePicker(_ datePicker: UIDatePicker) {
textField.text = datePicker.date.formatted
}
override func viewDidLoad() {
super.viewDidLoad()
datePicker.addTarget(self, action: #selector(handleDatePicker), for: .valueChanged)
}
extension Date {
static let formatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "EEEE, dd MMM yyyy HH:mm:ss Z"
return formatter
}()
var formatted: String {
return Date.formatter.string(from: self)
}
}