【问题标题】:Detect if UIDatePicker is rolling?检测 UIDatePicker 是否正在滚动?
【发布时间】:2011-02-20 06:50:34
【问题描述】:

我在模式视图中使用 UIDatePicker 来选择日期。我发现如果在日期选择器仍在滚动时关闭视图,我会得到一个 EXC_BAD_ACCESS。

当用户点击按钮时,如何检测日期选择器正在滚动?

我有两个想法:

1) 检测值是否随此变化:

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

但我需要能够检测值是否会改变。

2)检查日期是否有效,但是当日期选择器滚动时,返回的是之前的日期,当然是有效的。

有什么想法吗?

【问题讨论】:

  • 我认为不可能从 UIPickerViewUIDatePicker 获取滚动事件。
  • 日期选择器(和选择器视图)不提供一种方法来了解其中一个组件是否正在移动。

标签: iphone objective-c uidatepicker


【解决方案1】:

为了避免这种崩溃,您无需尝试预测选择器何时会尝试向您的类发送操作方法调用,而是只需在 ViewController 的 dealloc 例程中删除选择器的事件操作。

编辑:哎呀,正如评论中指出的那样,UIDatePicker 没有委托。但是您可以为其分配动作事件。因此,应删除指向正在解除分配的对象的任何操作集。

- (void dealloc
{
    [myPicker removeTarget:self action:... forControlEvents:...];
    [myPicker release];
    [super dealloc];
}

【讨论】:

  • UIDatePicker 没有代表。
【解决方案2】:

我知道我已经很晚了,但我刚刚创建了一个带有委托的自定义 UIDatePicker 子类:

这是代表:

// In TDDatePickerDelegate.h

#import <Foundation/Foundation.h>
#import "TDDatePicker.h"

@class TDDatePicker;
@protocol TDDatePickerDelegate

@required
- (void)datePickerChanged:(TDDatePicker *)datePicker newDate:(NSDate *)newDate;

@end

这是子类

// In TDDatePicker.h

#import <UIKit/UIKit.h>

#import "TDDatePickerDelegate.h"
@interface TDDatePicker : UIDatePicker

- (void)setHidden:(BOOL)hidden animated:(BOOL)animated;
- (void)dateChanged;

@property (nonatomic, assign) IBOutlet id <TDDatePickerDelegate> delegate;

@end



// In TDDatePicker.m

#import "TDDatePicker.h"

@implementation TDDatePicker

@synthesize delegate;

- (id)init {
    self = [super init];
    if (self) {
    [self addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged];
}
return self;
}

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged];
    }
    return self;
}
- (void)dateChanged {
    [delegate datePickerChanged:self newDate:self.date];
}

- (void)dealloc {
    [self removeTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged];
}

@end

【讨论】:

  • 这就是我想要的子类。谢谢!
【解决方案3】:

目标-C:

[datePicker addTarget:self action:@selector(isRolled) forControlEvents:UIControlEventValueChanged];

- (void)isRolled {
     NSLog(@"Date Picker has been rolled.");
}

斯威夫特:

datePicker.addTarget(self, action: "isRolled", forControlEvents: .ValueChanged)

func isRolled() {
    print("Date Picker has been rolled.")
}

【讨论】:

    【解决方案4】:

    正式地,您无法使用 Apple 官方的 UIDatePicker 方法检索这些术语中的选取器状态。

    不过,如果有解决方案,我很想看看。

    【讨论】:

      【解决方案5】:

      有一个技巧可以检测到这一点,但没有委托方法/属性来检测它是否滚动

      1. 将属性作为isScrolling
      2. func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -&gt; String? 或等效方法中将isScrolling 设置为true
      3. func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 中将isScrolling 设置为true
      4. enable the close button for modal view only if picker has reached to a finite state that is scrolling is disabled

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-18
        • 2020-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多