Сборщик анимаций в + Готово + Обновление TextField

Привет Кто-нибудь может мне помочь с этим, я смотрел на многие предыдущие вопросы по этому вопросу, и они кажутся немного сложными. Я хочу настроить средство выбора, которое анимируется при прикосновении к текстовому полю, у которого есть IBOutlet с именем locationField.

Я не хочу добавлять палитру или панель инструментов и кнопки в свои раскадровки, я предпочел бы делать это программно.

Пока что у меня есть:

- (void)viewDidLoad
{
 //populate picker arrays
 locationPickerArray = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5", nil];


    actionSheet = [[UIActionSheet alloc] initWithTitle:@"" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];

    [actionSheet showInView:self.view];

    UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0,480,32)];
    [pickerToolbar sizeToFit];
    pickerToolbar.barStyle = UIBarStyleBlackTranslucent;

    NSMutableArray *barItems = [[NSMutableArray alloc] init];

    UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonSystemItemCancel target:self action:@selector(cancel_clicked:)];
    [barItems addObject:cancelBtn];

    UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    [barItems addObject:flexSpace];

    UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(done_clicked:)];

    [barItems addObject:doneBtn];
    [pickerToolbar setItems:barItems animated:YES];
    [actionSheet addSubview:pickerToolbar];

    UIPickerView *picker = [[UIPickerView alloc] init];
    picker.frame = CGRectMake(0, 44, 320, 216);
    picker.delegate  = self;
    picker.dataSource = self;
    picker.showsSelectionIndicator = YES;
    [actionSheet addSubview:picker];
}

-(void)done_clicked:(id)sender
{
    [actionSheet dismissWithClickedButtonIndex:0 animated:YES];
}

-(void)cancel_clicked:(id)sender
{
    [actionSheet dismissWithClickedButtonIndex:0 animated:YES];
}

У меня есть несколько вопросов по этому поводу, он падает на:

* Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: '-[DetailsScreenViewController numberOfComponentsInPickerView:]: нераспознанный селектор, отправленный экземпляру 0xb505be0'

Что это значит?

Мой последний вопрос: как я могу заполнить этот сборщик и назначить его всплывающему окну при нажатии на созданный ранее иблет (поле местоположения).

Спасибо

1 ответ

Решение

Причина вашего сбоя в том, что вы назначили экземпляр DetailsScreenViewController быть dataSource а также delegate из UIPickerView без фактической реализации методов для этих протоколов. Назначение происходит здесь:

picker.delegate  = self;
picker.dataSource = self;

Конкретный сбой говорит вам, что вы не реализовали numberOfComponentsInPickerView:, часть UIPickerViewDataSource протокол. Вы должны были получить предупреждение компилятора об этом на самом деле. Научиться использовать эти предупреждения может быть очень полезным! В любом случае, чтобы исправить это, предоставьте реализации всех необходимых методов для обоих протоколов. Детали реализации будут зависеть от потребностей вашего приложения. Если вам все еще нужна помощь с деталями, дайте мне знать.

Что касается вашего второго вопроса, я полагаю, UIPickerView внутри UIActionSheet это вещь сейчас. У меня никогда не было необходимости делать это раньше, но вот такой вопрос с большим количеством примеров кода для некоторой предыстории, не уверенный, читали ли вы его еще. Но я думаю, что вы просто хотите подождать, пока вы действительно захотите показать сборщику

[actionSheet showInView:self.view];

Я думаю, что вы можете сделать это в UITextFieldDelegate Метод, возможно, есть и другие способы. Я собираюсь попытаться сделать некоторые эксперименты с этим позже и обновить этот пост.

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

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    [actionSheet showInView:self.view];
    return NO;
}

КОНЕЦ РЕДАКТИРОВАНИЯ

Надеюсь, это поможет, и дайте мне знать, если у вас есть какие-либо вопросы.

Другие вопросы по тегам