Вопрос по ios, uipickerview, objective-c – Цель C, реализующая UIPickerView с кнопкой «Готово»

7

Я пытаюсь внедрить & quot; Готово & quot; кнопка в UIPickerView похожа на тот, под этимссылка на сайт

Я посмотрел в справочнике по классу, но не смог его найти

Спасибо

Ваш Ответ

6   ответов
0

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

Глядя на раскадровку, мы видим, что при нажатии кнопки & quot; Роль & quot; поле внутри & quot; AddPersonTVC.h & quot; (класс в правом верхнем углу раскадровки), появляется класс & quot; RollPickerTVCell.h & quot;

Рассматривая RollPickerTVCell.h, мы замечаем, что весь класс является подклассом «CoreDataTableViewCell».

@interface RolePickerTVCell : CoreDataTableViewCell <UIPickerViewDataSource, UIPickerViewDelegate>

Глядя на класс «CoreDataTableViewCell.m», мы наконец-то нашли наш элемент uibarbuttonitem!

UIBarButtonItem *doneBtn =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)];
0

UITextField (следовательно, вы не будете использовать вспомогательное представление), вот что я сделал:

Я создал ячейку табличного представления под названиемGWDatePickerCell это выглядит так (без файлов .nib).

GWDatePickerCell.h:

#import <UIKit/UIKit.h>

@interface GWDatePickerCell : UITableViewCell

@property (nonatomic, strong) UIDatePicker *datePicker;
@property (nonatomic, strong) UIToolbar *toolbar;
@property (nonatomic, strong) UIBarButtonItem *buttonDone;

@end

GWDatePickerCell.m:

    #import "GWDatePickerCell.h"

    @implementation GWDatePickerCell

    - (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
        if(!(self=[super initWithStyle:style reuseIdentifier:reuseIdentifier])) return nil;

    _datePicker = [[UIDatePicker alloc] init];
    [_datePicker setMinuteInterval:5];
    [_datePicker setDatePickerMode:UIDatePickerModeDateAndTime];
    [self.contentView addSubview:_datePicker];

    _toolbar = [[UIToolbar alloc] init];
    _buttonDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:nil action:nil];
    _toolbar.items = @[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], _buttonDone];
    [self.contentView addSubview:_toolbar];

    return self;
}

- (void)layoutSubviews{
    [super layoutSubviews];
    CGRect r = self.contentView.bounds;
    r.origin.y +=44;
    r.size.height = 216;
    CGRect tb = self.contentView.bounds;
    tb.size.height = 44;
    _datePicker.frame = r;
    _toolbar.frame = tb;
}

@end

Теперь все, что мне нужно было сделать при создании ячеек в табличном представлении:

Specify the @selector for the Done button. Set the correct cell height in heightForRowAtIndexPath
2

DateTimePicker.h

    @interface DateTimePicker : UIView {
}

@property (nonatomic, assign, readonly) UIDatePicker *picker;

- (void) setMode: (UIDatePickerMode) mode;
- (void) addTargetForDoneButton: (id) target action: (SEL) action;

@end

DateTimePicker.m

#define MyDateTimePickerToolbarHeight 40

@interface DateTimePicker()

@property (nonatomic, assign, readwrite) UIDatePicker *picker;

@property (nonatomic, assign) id doneTarget;
@property (nonatomic, assign) SEL doneSelector;

- (void) donePressed;

@end


@implementation DateTimePicker

@synthesize picker = _picker;

@synthesize doneTarget = _doneTarget;
@synthesize doneSelector = _doneSelector;

- (id) initWithFrame: (CGRect) frame {
    if ((self = [super initWithFrame: frame])) {
        self.backgroundColor = [UIColor clearColor];

        UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame: CGRectMake(0, MyDateTimePickerToolbarHeight, frame.size.width, frame.size.height - MyDateTimePickerToolbarHeight)];
        [self addSubview: picker];

        UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame: CGRectMake(0, 0, frame.size.width, MyDateTimePickerToolbarHeight)];
        toolbar.barStyle = UIBarStyleBlackOpaque;
        toolbar.autoresizingMask = UIViewAutoresizingFlexibleWidth;

        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle: @"Done" style: UIBarButtonItemStyleBordered target: self action: @selector(donePressed)];
        UIBarButtonItem* flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
        toolbar.items = [NSArray arrayWithObjects:flexibleSpace, doneButton, nil];

        [self addSubview: toolbar];

        self.picker = picker;
        picker.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin;

        self.autoresizesSubviews = YES;
        self.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin;
    }
    return self;
}

- (void) setMode: (UIDatePickerMode) mode {
    self.picker.datePickerMode = mode;
}

- (void) donePressed {
    if (self.doneTarget) {
        [self.doneTarget performSelector:self.doneSelector withObject:nil afterDelay:0];
    }
}

- (void) addTargetForDoneButton: (id) target action: (SEL) action {
    self.doneTarget = target;
    self.doneSelector = action;
}

Используя пользовательский вид в вашем контроллере вида:

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self
               action:@selector(buttonPressed:)
     forControlEvents:UIControlEventTouchDown];
    [button setTitle:@"Show picker" forState:UIControlStateNormal];
    button.frame = CGRectMake(100, 50, 100, 40.0);
    [self.view addSubview:button];

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenWidth = screenRect.size.width;
    CGFloat screenHeight = screenRect.size.height;
    picker = [[DateTimePicker alloc] initWithFrame:CGRectMake(0, screenHeight/2 - 35, screenWidth, screenHeight/2 + 35)];
    [picker addTargetForDoneButton:self action:@selector(donePressed)];
    [self.view addSubview:picker];
    picker.hidden = YES;
    [picker setMode:UIDatePickerModeDate];
}

-(void)donePressed {
    picker.hidden = YES;
}

-(void)buttonPressed:(id)sender {
    picker.hidden = NO;
}

Надеюсь это поможет. :)

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
6

с рамкой, установленной так, что она изначально не видна (значение y равно высоте родительского вида).

Каждый раз, когда пользователь получает доступ к средству выбора, я менял рамку (значение y) UIDatePicker и UIToolbar с анимацией, чтобы она скользила вверх вместе со средством выбора в нижней части экрана, подобно клавиатуре.

Проверьте мой код ниже.

- (IBAction)showPicker
{
    if(pickerVisible == NO)
    {
        // create the picker and add it to the view
        if(self.datePicker == nil) self.datePicker = [[[UIDatePicker alloc] initWithFrame:CGRectMake(0, 460, 320, 216)] autorelease];
        [self.datePicker setMaximumDate:[NSDate date]];
        [self.datePicker setDatePickerMode:UIDatePickerModeDate];
        [self.datePicker setHidden:NO];
        [self.view addSubview:datePicker];

        // the UIToolbar is referenced 'using self.datePickerToolbar'
        [UIView beginAnimations:@"showDatepicker" context:nil];
        // animate for 0.3 secs.
        [UIView setAnimationDuration:0.3];

        CGRect datepickerToolbarFrame = self.datePickerToolbar.frame;
        datepickerToolbarFrame.origin.y -= (self.datePicker.frame.size.height + self.datePickerToolbar.frame.size.height);
        self.datePickerToolbar.frame = datepickerToolbarFrame;

        CGRect datepickerFrame = self.datePicker.frame;
        datepickerFrame.origin.y -= (self.datePicker.frame.size.height + self.datePickerToolbar.frame.size.height);
        self.datePicker.frame = datepickerFrame;

        [UIView commitAnimations];
        pickerVisible = YES;
    }
}

- (IBAction)done
{
    if(pickerVisible == YES)
    {
        [UIView beginAnimations:@"hideDatepicker" context:nil];
        [UIView setAnimationDuration:0.3];

        CGRect datepickerToolbarFrame = self.datePickerToolbar.frame;
        datepickerToolbarFrame.origin.y += (self.datePicker.frame.size.height + self.datePickerToolbar.frame.size.height);
        self.datePickerToolbar.frame = datepickerToolbarFrame;

        CGRect datepickerFrame = self.datePicker.frame;
        datepickerFrame.origin.y += (self.datePicker.frame.size.height + self.datePickerToolbar.frame.size.height);
        self.datePicker.frame = datepickerFrame;
        [UIView commitAnimations];

        // remove the picker after the animation is finished
        [self.datePicker performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0.3];
    }
}
Error: User Rate Limit Exceeded
39

зработчике. ЭтоUIView содержащийUIToolbar иUIPickerView.

enter image description here

Затем создайте выход дляUIView и подключите его.

enter image description here

Если у вас естьUITextField Вы можете назначить свой собственный вид на егоinputView имущество.

[self.textField setInputView:self.customPicker];

В качестве альтернативы вы можете добавить сборщик на ваш основной вид ...

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.customPicker.frame = CGRectMake(0, CGRectGetMaxY(self.view.frame), CGRectGetWidth(self.customPicker.frame), CGRectGetHeight(self.customPicker.frame));
    [self.view addSubview:self.customPicker];
}

... а затем используйте этот метод, чтобы показать или скрыть сборщик.

- (void)setPickerHidden:(BOOL)hidden
{
    CGAffineTransform transform = hidden ? CGAffineTransformIdentity : CGAffineTransformMakeTranslation(0, -CGRectGetHeight(self.customPicker.frame));

    [UIView animateWithDuration:0.3 animations:^{
        self.customPicker.transform = transform;
    }];
}
Error: User Rate Limit Exceededgithub.com/chriskempson/tomorrow-theme/tree/master/Xcode%204
Error: User Rate Limit Exceeded
1

Готово & quot; кнопка на панели инструментов с помощью ActionSheetPicker. Это отличная альтернатива созданию его самостоятельно.

https://github.com/skywinder/ActionSheetPicker-3.0

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы