Domanda

Io sono l'aggiunta con successo un pulsante Fine per il mio numero di pad con questo codice a portata di mano sotto. Ma ho un pulsante di e-mail che lanci il MFMailComposeViewController. Come faccio a fare in modo il pulsante Fine non viene visualizzato sulla tastiera email?

//
//  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

Sto cercando di estendere l'UIViewController modo lo fa automaticamente questo quando ho importare questa sottoclasse, per cui un flag booleano nella mia applicazione probabilmente non funzionerà.

È stato utile?

Soluzione

Per iOS 3.2, non si deve usare questo hack più, in ogni caso. Invece, assegnare la visualizzazione personalizzata alla proprietà inputAccessoryView del vostro controllo.

Altri suggerimenti

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

ho continuato a giocare con questo un po 'e ha preso un sacco di idee da questo e molti altri thread. Alla fine ho fatto una sottoclasse di UIViewController che gestire il problema della tastiera numerica, ma poi ho deciso che non sarebbe sufficientemente generico perché potrei aver bisogno di ereditare da UITableViewController ed ancora implementare questa. Così ho refactoring ha fatto una classe di supporto che fa tutto il lavoro ed è abbastanza semplice da implementare. Quindi, ecco che cosa ho finito con. Il file h ha le misure necessarie per l'attuazione del presente nella classe UIViewController in cui si desidera utilizzarlo.

L'unica cosa che non riesco a capire è il motivo per cui non riesco a sbarazzarsi di questo messaggio di avviso "Attributi sull'attuazione metodo e la sua dichiarazione deve corrispondere". Penso che abbia qualcosa a che fare con la lista argomenti variabili e NS_REQUIRES_NIL_TERMINATION

Mi auguro che altri trovare questo codice utile e se qualcuno sa come sbarazzarsi del messaggio di avviso mi piacerebbe scoprirlo.

Oh, e ho quasi dimenticato è necessario aggiungere i file di immagine per i pulsanti. Li ho scaricato da qualche altro thread molto tempo fa e dimenticato dove, ma non dovrebbe essere difficile da trovare.

//
//  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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top