web-dev-qa-db-ja.com

UIDatePickerの変化を観察する

UIDatePickerの変更を監視するデリゲートがないことに気付きました。ピッカーに変更が加えられたことを、何も確認せずに検出する方法があります。たとえば、新しい番号にスピンして着地した瞬間など、それを検出できます。キーバリューの観察について考えましたが、その場で変化する特性はないと思います

37
Chris

IBに移動し、UIDatePickerから.hファイルにドラッグします。次に選択enter image description here

.mファイルで必要に応じてこれを処理します。 XCodeは以下のメソッドを追加します。

enter image description here

42
Dustin

日付の変更を処理するには、UIDatePickerにUIControlEventValueChangedイベントを追加する必要があります。

[myDatePicker addTarget:self action:@selector(dateIsChanged:) forControlEvents:UIControlEventValueChanged];

次に、実装:

- (void)dateIsChanged:(id)sender{
     NSLog(@"Date changed");
}
66
chroman

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
2
Leo Natan

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)
    }
}
1
Argus