У вас должен быть один источник истины . Поскольку таблице потребуется эта информация, ее следует сохранить в таблице и передать компоненту раскрывающегося меню.
Оформить заказ этот пример кода и коробки .
Техника, описанная в блоге Лузиана Шеррера , работает в iOS 4.0.
Мой код для добавления кнопки на клавиатуру не удался, потому что он вызывался из метода делегата textFieldDidBeginEditing:
, который (в 4.0) вызывается перед созданием подпредставлений окна клавиатуры. Я исправил проблему, вызвав мой код, когда наблюдается UIKeyboardWillShowNotification
, что происходит достаточно поздно.
Вы можете добавить inputAccessoryView
с помощью кнопок «Применить» и «Отмена», а затем отклонить цифровую клавиатуру.
- (void)viewDidLoad
{
[super viewDidLoad];
UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
numberToolbar.items = [NSArray arrayWithObjects:
[[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelNumberPad)],
[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
[[UIBarButtonItem alloc]initWithTitle:@"Apply" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithNumberPad)],
nil];
numberTextField.inputAccessoryView = numberToolbar;
}
-(void)cancelNumberPad{
[numberTextField resignFirstResponder];
numberTextField.text = @"";
}
-(void)doneWithNumberPad{
NSString *numberFromTheKeyboard = numberTextField.text;
[numberTextField resignFirstResponder];
}
Я отправил это в Apple как ошибку. Интерфейсный конструктор позволяет разработчику указать тип клавиши возврата для типа клавиатуры цифровой клавиатуры. Ошибка № 8759674.
Apple продолжила, сказав, что эта проблема была ранее зарегистрирована как идентификатор ошибки # 5885964, и они закрыли 8759674.
Я создал версию, чтобы включить горизонтальную версию numpad ..., включив технику, описанную в блоге Лузиана Шеррера, и добавив два дополнительных png (не включенных здесь), и логическое значение "isLandscape" в "didRotateFromInterfaceOrientation". "метод ..
@interface AlarmController ()
{
CGRect doneButtnRectVert;
CGRect doneButtnRectHorz;
CGRect doneButtnRect;
UIImage* DoneUpVert;
UIImage* DoneDownVert;
UIImage* DoneUpHorz;
UIImage* DoneDownHorz;
UIImage* DoneUp;
UIImage* DoneDown;
UIButton *oldDoneButton;
}
@end
//---------------------------------------------------------------------------
- (void)viewDidUnload
{
NSLog(@"viewDidUnload AlarmController");
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIKeyboardDidShowNotification object:nil];
[super viewDidUnload];
}
//---------------------------------------------------------------------------
- (void)addButtonToKeyboard
{
NSLog(@"addButtonToKeyboard AlarmController");
if (isLandscape)
{
doneButtnRect = doneButtnRectHorz;
DoneUp = DoneUpHorz;
DoneDown = DoneDownHorz;
} else {
doneButtnRect = doneButtnRectVert;
DoneUp = DoneUpVert;
DoneDown = DoneDownVert;
}
UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
doneButton.frame = doneButtnRect;
doneButton.adjustsImageWhenHighlighted = NO;
[doneButton setImage:DoneUp forState:UIControlStateNormal];
[doneButton setImage:DoneDown forState:UIControlStateHighlighted];
[doneButton addTarget:self action:@selector(done:) forControlEvents:UIControlEventTouchUpInside];
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
UIView* keyboard;
for(int i=0; i<[tempWindow.subviews count]; i++)
{
keyboard = [tempWindow.subviews objectAtIndex:i];
if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES)
{
if (oldDoneButton) [oldDoneButton removeFromSuperview];
[keyboard addSubview:doneButton];
}
}
oldDoneButton = doneButton;
}
//---------------------------------------------------------------------------
- (void)keyboardDidShow:(NSNotification *)note
{
NSLog(@"keyboardDidShow AlarmController");
[self addButtonToKeyboard];
}
#pragma mark -
#pragma mark meaty area...
//---------------------------------------------------------------------------
- (void)textFieldDidEndEditing:(UITextField *)textField
{
NSLog(@"textFieldDidEndEditing AlarmController");
oldDoneButton = nil;
}
//---------------------------------------------------------------------------
- (void)viewDidLoad
{
NSLog(@"viewDidLoad AlarmController");
[super viewDidLoad];
doneButtnRectVert = CGRectMake(0, 163, 106, 53);
doneButtnRectHorz = CGRectMake(0, 122, 159, 40);
DoneUpVert = [UIImage imageNamed:@"DoneUp3.png"];
DoneDownVert = [UIImage imageNamed:@"DoneDown3.png"];
DoneUpHorz = [UIImage imageNamed:@"DoneUpHor.png"];
DoneDownHorz = [UIImage imageNamed:@"DoneDnHor.png"];
doneButtnRect = doneButtnRectVert;
DoneUp = DoneUpVert;
DoneDown = DoneDownVert;
oldDoneButton = nil;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification object:nil];
}
У меня это работает. См. Код здесь: http://gist.github.com/454844
Возникли две проблемы:
UIKeyboardWillShowNotification
отправляется до того, как существует представление клавиатуры, но вы планируете запуск кода на следующем проходе цикла выполнения они действительно существуют. Так что вам не нужно беспокоиться о DidShow
, который визуально менее приятен.
В iOS 4 представление UIKeyboard
находилось где-то в иерархии представлений.