Я продолжал играть с этим некоторое время и взял кучу идей из этой и нескольких других тем. В конце концов я создал подкласс UIViewController, который будет обрабатывать проблему с цифровой клавиатурой, но затем я решил, что это не будет достаточно универсальным, потому что мне может понадобиться наследовать от UITableViewController и все же реализовать это. Поэтому я реорганизовал его, создав вспомогательный класс, который выполняет всю работу и довольно прост в реализации. Итак, вот чем я закончил. Файл .h содержит шаги, необходимые для реализации этого в вашем классе UIViewController, где вы хотите его использовать.
Единственное, что я не могу понять, это то, почему я не могу избавиться от этого предупреждающего сообщения "Атрибуты при реализации метода и его объявления должны совпадать". Я думаю, что это как-то связано со списком переменных аргументов и NS_REQUIRES_NIL_TERMINATION
Я надеюсь, что другие найдут этот код полезным, и если кто-нибудь знает, как избавиться от предупреждающего сообщения, я хотел бы узнать.
О, и я почти забыл, что вам нужно добавить файлы изображений для кнопок. Я загрузил их из какой-то другой ветки давным-давно и забыл, где, но они не должны быть трудно найти.
//
// NumericKeyboardHelper.h
//
// Created by Joseph Gagliardo on 7/6/12.
// Copyright (c) 2012 Joseph Gagliardo. All rights reserved.
//
#import <Foundation/Foundation.h>
/*
1. Import this header file
2. Add the NumericKeyboardHelperProtocol to the UIViewController<NumericKeyboardHelperProtocol>
3. Add a property to create this helper class
@property (strong, nonatomic) NumericKeyboardHelper *numericKeyboardHelper;
4. synthesize it and clean it up when done in the viewDidUnload
@synthesize numericKeyboardHelper=_numericKeyboardHelper;
[self setNumericKeyboardHelper:nil];
5. Insert the following line in the viewDidLoad of the controller
self.numericKeyboardHelper = [[NumericKeyboardHelper alloc] initWithObserver:self andSelector:@selector(numericDoneButtonPressed:) andFields: self.TextField1, self.TextField2, nil];
where self.TextField1, ... are the textField Outlets that have a numeric keyboard
6. Provide a numericDoneButtonPressed: method as required by the protocol to receive the message when the done button is pressed
The helper class does all the rest of the work
*/
@protocol NumericKeyboardHelperProtocol
- (void)numericDoneButtonPressed:(id)sender;
@end
@interface NumericKeyboardHelper : NSObject
@property (strong, nonatomic) UIButton *numericDoneButton;
@property (strong, nonatomic) NSArray *numericFields;
@property (weak, nonatomic) UIViewController *viewController;
- (void)showNumericKeyboard:(id)sender;
- (void)hideNumericKeyboard:(id)sender;
- (id) initWithObserver: (id) observer andSelector:(SEL)selector andFields:(UIControl *)argList, ... NS_REQUIRES_NIL_TERMINATION;
@end
//
// NumericKeyboardHelper.m
//
// Created by Joseph Gagliardo on 7/6/12.
// Copyright (c) 2012 Joseph Gagliardo. All rights reserved.
//
#import "NumericKeyboardHelper.h"
@implementation NumericKeyboardHelper
@synthesize numericDoneButton=_numericDoneButton;
@synthesize viewController=_viewController;
@synthesize numericFields=_numericFields;
- (id) initWithObserver: (id) observer andSelector:(SEL)selector andFields:(UIControl *)argList, ... NS_REQUIRES_NIL_TERMINATION
{
if (self = [super init])
{
[[NSNotificationCenter defaultCenter] addObserver:observer
selector:selector
name:@"numericDoneButtonPressed"
object:nil];
NSMutableArray *a = [[NSMutableArray alloc]init];
va_list args;
va_start(args, argList);
for (UIControl *arg = argList; arg != nil; arg = va_arg(args, UIControl*))
{
[a addObject:arg];
}
va_end(args);
self.numericFields = [NSArray arrayWithArray:a];
NSLog(@"Array count %i", [a count]);
self.viewController = observer;
[self setAllTextFields:self.viewController.view];
}
return self;
}
- (void) setAllTextFields: (UIView *) view
{
for (UIView *v in view.subviews)
{
if ([v isKindOfClass:[UITextField class]])
{
UITextField *t = (UITextField *)v;
if ([self.numericFields containsObject:v])
[t addTarget:self action:@selector(showNumericKeyboard:) forControlEvents:UIControlEventTouchDown];
else
[t addTarget:self action:@selector(hideNumericKeyboard:) forControlEvents:UIControlEventTouchDown];
}
else if ([v.subviews count] > 0)
{
[self setAllTextFields:v];
}
}
}
- (void)addNumericDoneButtonToKeyboard
{
if (self.numericDoneButton == nil)
{
self.numericDoneButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.numericDoneButton.frame = CGRectMake(0, 163, 106, 53);
self.numericDoneButton.adjustsImageWhenHighlighted = NO;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.0)
{
[self.numericDoneButton setImage:[UIImage imageNamed:@"DoneUp3.png"] forState:UIControlStateNormal];
[self.numericDoneButton setImage:[UIImage imageNamed:@"DoneDown3.png"] forState:UIControlStateHighlighted];
}
else
{
[self.numericDoneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal];
[self.numericDoneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted];
}
[self.numericDoneButton addTarget:self action:@selector(numericDoneButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
}
[[self keyboardView] addSubview:self.numericDoneButton];
}
- (void)showNumericKeyboard:(id)sender
{
[self addNumericDoneButtonToKeyboard];
self.numericDoneButton.hidden = NO;
}
- (void)hideNumericKeyboard:(id)sender
{
self.numericDoneButton.hidden = YES;
}
- (UIView *)keyboardView
{
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
UIView* keyboard;
for(int i=0; i<[tempWindow.subviews count]; i++)
{
keyboard = [tempWindow.subviews objectAtIndex:i];
if (([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2 && [[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES) || [[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
return keyboard;
}
return nil;
}
- (void)numericDoneButtonPressed:(id)sender
{
for (UIControl *c in self.numericFields)
[c resignFirstResponder];
[[NSNotificationCenter defaultCenter]
postNotificationName:@"numericDoneButtonPressed"
object:sender ];
}
@end