Frage

Ich füge erfolgreich getan Taste, um meinen Nummernblock mit diesem praktischen Code unten. Aber ich habe eine E-Mail-Taste, dass startet die MFMailComposeViewController. Wie würde ich sicherstellen, dass die Schaltfläche Fertig, um nicht auf der E-Mail-Tastatur erscheint?

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

Ich versuche, die UIViewController zu erweitern, so dass es dies automatisch tut, wenn ich diese Unterklasse zu importieren, so ein boolean-Flag in meiner Anwendung wahrscheinlich nicht funktionieren.

War es hilfreich?

Lösung

Für iOS 3.2+, sollten Sie nicht diesen Hack verwenden mehr, sowieso. Stattdessen ordnen Sie benutzerdefinierte Ansicht auf Ihre inputAccessoryView Eigenschaft Kontrolle.

Andere Tipps

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

Ich hielt Spiel mit diesem eine Weile und nahm eine Reihe von Ideen aus diesem und einigen anderen Threads. Ich habe schließlich eine Unterklasse von UIViewController, die die numerische Tastatur Problem umgehen würde, aber dann entschied ich, dass nicht allgemein genug sein würde, weil ich aus UITableViewController zu vererben müssen und dies noch implementieren. So Refactoring ich es eine Hilfsklasse gemacht, die alle die Arbeit macht und ist ziemlich einfach zu implementieren. So, hier ist was ich am Ende mit. Die H-Datei hat die notwendigen Schritte diese Klasse in Ihrem UIViewController zu implementieren, wo Sie wollen, es zu benutzen.

Das einzige, was ich nicht herausfinden kann, ist, warum ich nicht loswerden dieser Warnmeldung „Attribute auf Methodenimplementierung und seine Erklärung müssen übereinstimmen“ bekommen kann. Ich denke, es hat etwas mit der variablen Argumenten Liste und NS_REQUIRES_NIL_TERMINATION

zu tun

Ich hoffe, dass andere diesen Code hilfreich, und wenn jemand weiß, wie die Warnmeldung loszuwerden würde ich gerne erfahren.

Oh, und ich habe fast vergessen Sie die Bilddateien für die Schaltflächen hinzufügen müssen. Ich heruntergeladen sie von einem anderen Thread schon vor langer Zeit und vergessen, wo, aber sie sollte nicht schwer zu bekommen.

//
//  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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top