2010-12-05 95 views
3

我正在使用下面的这个方便的代码成功添加完成按钮到我的数字键盘上。但我有一个电子邮件按钮,启动MFMailComposeViewController。我如何确保完成按钮不会出现在电子邮件键盘上?将完成按钮添加到iPhone上的数字键盘键盘上

// 
// 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所以它会自动执行此当我输入这个子类,所以在我的应用程序中的布尔标志可能不会工作。

回答

4

对于iOS 3.2+,无论如何,你都不应该再使用这个黑客技术。相反,将您的自定义视图分配给您的控件的inputAccessoryView属性。

+0

你能详细说明一下示例代码吗?我在哪里可以使用inputAccessoryView? – Bryan 2010-12-05 19:03:56

+0

在文档中查找`inputAccessoryView`。您将自定义视图分配给`myTextField.inputAccessoryView = ...`,并且当此文本字段成为第一个响应者时它会自动显示。 – 2010-12-05 19:20:10

+0

我无法定位按钮。它保持键盘的顶部和中心,但工作。 – Bryan 2010-12-05 20:08:40

1
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]; 
} 
-1

我一直在玩这一段时间,并从这个和其他几个线程了一堆想法。我最终做了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