将完成按钮添加到iPhone上的数字键盘
-
08-10-2019 - |
题
我在下面的此方便的代码中成功地将DONE按钮添加到我的数字板中。但是我有一个电子邮件按钮,该按钮启动了MFMailComposeViewController。我将如何确保在电子邮件键盘上没有出现完成按钮?
//
// UIViewController+NumPadReturn.m
// iGenerateRandomNumbers
//
// Created by on 12/4/10.
// Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import "UIViewController+NumPadReturn.h"
@implementation UIViewController (NumPadReturn)
-(void) viewDidLoad{
// add observer for the respective notifications (depending on the os version)
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification
object:nil];
} else {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
}
}
- (void)keyboardWillShow:(NSNotification *)note {
// if clause is just an additional precaution, you could also dismiss it
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 3.2) {
[self addButtonToKeyboard];
}
}
- (void)keyboardDidShow:(NSNotification *)note {
// if clause is just an additional precaution, you could also dismiss it
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
[self addButtonToKeyboard];
}
}
- (void)addButtonToKeyboard {
// create custom button
UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
doneButton.frame = CGRectMake(0, 163, 106, 53);
doneButton.adjustsImageWhenHighlighted = NO;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.0) {
[doneButton setImage:[UIImage imageNamed:@"DoneUp3.png"] forState:UIControlStateNormal];
[doneButton setImage:[UIImage imageNamed:@"DoneDown3.png"] forState:UIControlStateHighlighted];
} else {
[doneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal];
[doneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted];
}
[doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside];
// locate keyboard view
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
UIView* keyboard;
for(int i=0; i<[tempWindow.subviews count]; i++) {
keyboard = [tempWindow.subviews objectAtIndex:i];
// keyboard found, add the button
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES)
[keyboard addSubview:doneButton];
} else {
if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
[keyboard addSubview:doneButton];
}
}
}
- (void)doneButton:(id)sender {
NSLog(@"doneButton");
[self.view endEditing:TRUE];
}
@end
我正在尝试扩展uiviewController,因此当我导入此子类时,它会自动执行此操作,因此我的应用程序中的布尔值可能无法正常工作。
解决方案
对于iOS 3.2+,无论如何,您都不应该再使用此黑客了。相反,将您的自定义视图分配给您的控件 inputAccessoryView
财产。
其他提示
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
UIButton *myDoneButton = [self GetKeyboardDoneButton];
myMinText.inputAccessoryView = myDoneButton;
myMaxText.inputAccessoryView = myDoneButton;
}
- (UIButton *)GetKeyboardDoneButton {
// create custom button
UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
doneButton.frame = CGRectMake(-100, 163, 106, 53);
doneButton.adjustsImageWhenHighlighted = NO;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.0) {
[doneButton setImage:[UIImage imageNamed:@"DoneUp3.png"] forState:UIControlStateNormal];
[doneButton setImage:[UIImage imageNamed:@"DoneDown3.png"] forState:UIControlStateHighlighted];
} else {
[doneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal];
[doneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted];
}
[doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside];
return doneButton;
}
- (void)doneButton:(id)sender {
NSLog(@"doneButton");
[self.view endEditing:TRUE];
}
我一直在玩这个,并从这个和其他几个线程中提出了很多想法。我最终制作了一个UiviewController的子类,该子类可以处理数字键盘问题,但后来我认为这是不够通用的,因为我可能需要从UaithitviewController继承并仍然实现此功能。因此,我重构了它做了一个助手课,可以完成所有工作,并且非常简单地实施。所以这就是我最终得到的。 .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
不隶属于 StackOverflow