Определить, катится ли UIDatePicker? - PullRequest
9 голосов
/ 20 февраля 2011

Я использую UIDatePicker в модальном представлении, чтобы выбрать дату. Я обнаружил, что, если представление закрывается, когда средство выбора даты все еще находится в движении, я получаю EXC_BAD_ACCESS.

Как я могу обнаружить, что сборщик даты катится, когда пользователь нажимает кнопку?

У меня было две идеи:

1) определить, изменилось ли значение с этим:

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

Но мне нужно было бы определить, изменится ли значение.

2) проверить, является ли дата действительной, но когда происходит выбор даты, возвращается предыдущая дата, и, конечно, она действительна.

Есть идеи?

Ответы [ 5 ]

11 голосов
/ 20 февраля 2011

Чтобы избежать этого сбоя, вам не нужно пытаться предсказать, когда сборщик попытается отправить вызов метода действия вашему классу, вместо этого вы просто удалите событие события выбора в подпрограмме dealloc вашего ViewController.1001 *

РЕДАКТИРОВАТЬ: упс, как было отмечено в комментарии, UIDatePicker не имеет делегата.Но вы можете назначить ему события действия.Поэтому вместо этого любые действия, указывающие на объект, который обрабатывается, должны быть удалены.

- (void dealloc
{
    [myPicker removeTarget:self action:... forControlEvents:...];
    [myPicker release];
    [super dealloc];
}
4 голосов
/ 06 мая 2012

Я знаю, что довольно поздно, но я только что создал собственный подкласс 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
1 голос
/ 23 января 2016

Objective-C:

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

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

Swift:

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

func isRolled() {
    print("Date Picker has been rolled.")
}
0 голосов
/ 22 мая 2017

Есть способ обнаружить это, но нет метода / свойства делегата, чтобы определить, прокручивается ли он или нет

  1. взять свойство как isScrolling
  2. установите для isScrolling значение true в func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? или эквивалентный метод
  3. установить isScrolling в true в func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
  4. включить кнопку закрытия для модального просмотра, только если сборщик достиг конечного состояния, при котором прокрутка отключена

надеюсь, это поможет

0 голосов
/ 20 февраля 2011

Официально вы не можете получить состояние сборщика в этих терминах с помощью только официальных UIDatePicker методов Apple.

Однако, если есть какие-то решения, мне было бы интересно их увидеть.

...