在 Xcode 4.3 中的键盘上放置一个 UIToolbar

Posted

技术标签:

【中文标题】在 Xcode 4.3 中的键盘上放置一个 UIToolbar【英文标题】:placing a UIToolbar over the Keyboard in Xcode 4.3 【发布时间】:2012-04-26 12:04:24 【问题描述】:

这是我的第一篇文章,我对 ios 编程很陌生。我正在使用 xcode 4.3 并且有什么可能是一个简单的问题。我已经到处寻找一种将工具栏放置在键盘上方的方法,该键盘上有一个上一个/下一个按钮。当 xcode 使用界面生成器时,我发现了一些关于如何执行此操作的 tuts。但我找不到适用于最新版本 xcode 的版本。所以我把我在互联网上和苹果开发网站上找到的东西拿出来了一些代码。唯一的问题是,它不起作用!我收到一个错误,指出在 inputAcessoryView 的行上分配给只读属性。我知道这可能很简单,但是当将代码从以前的版本转移到较新的版本时,我很可能搞砸了。有人可以检查我的代码并让我知道我做错了什么。非常感谢。我已经包含了我的 .h/.m 文件

    #import <UIKit/UIKit.h>

    @interface keyboardViewController : UIViewController


    @property (retain, nonatomic) IBOutlet UIView *textField1;
    @property (retain, nonatomic) IBOutlet UIView *textField2;

    @property (nonatomic, retain) UIToolbar *keyboardToolbar;

    -(void)resignKeyboard:(id)sender;
    -(void)previousField:(id)sender;
    -(void)nextField:(id)sender;

    @end

实现

    #import "keyboardViewController.h"

    @interface keyboardViewController ()

    @end

    @implementation keyboardViewController
    @synthesize textField1;
    @synthesize textField2;
    @synthesize keyboardToolbar;

    - (void)viewDidLoad
    
        [super viewDidLoad];

        if (keyboardToolbar == nil)
        
            keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0,                            self.view.bounds.size.width, 44)]; 

            UIBarButtonItem *previousButton = [[UIBarButtonItem alloc] initWithTitle:@"previous" 
                                                                               style:UIBarButtonItemStyleBordered
                                                                      target:self 
                                                                      action:@selector(previousField:)];
            UIBarButtonItem *nextButton = [[UIBarButtonItem alloc] initWithTitle:@"next" 
                                                                           style:UIBarButtonItemStyleBordered
                                                                          target:self 
                                                                          action:@selector(nextField:)];

            UIBarButtonItem *extraSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:(UIBarButtonSystemItemFlexibleSpace) target:nil action:nil];


            UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:(UIBarButtonSystemItemDone) target:self action:@selector(resignKeyboard:)];



            [keyboardToolbar setItems:[[NSArray alloc] initWithObjects:previousButton, nextButton, extraSpace, done, nil]];

            textField1.inputAccessoryView  = keyboardToolbar;
            textField2.inputAccessoryView  = keyboardToolbar;


        


    

    -(void) resignKeyboard:(id)sender
    
        if ([textField1 isFirstResponder])
            [textField1 resignFirstResponder];

        else if ([textField2 isFirstResponder])
        [textField2 resignFirstResponder];
    

    -(void) previousField:(id)sender
    
        if ([textField1 isFirstResponder])
            [textField2 becomeFirstResponder];

        else if ([textField2 isFirstResponder])
            [textField1 becomeFirstResponder];
    


    -(void) nextField:(id)sender
    
        if ([textField1 isFirstResponder])
            [textField2 becomeFirstResponder];

        else if ([textField2 isFirstResponder])
            [textField1 becomeFirstResponder];
    


    - (void)viewDidUnload
    
        [self setTextField1:nil];
        [self setTextField2:nil];
        [self setKeyboardToolbar:nil];
        [super viewDidUnload];
        // Release any retained subviews of the main view.
    

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    

    @end

【问题讨论】:

【参考方案1】:
@interface keyboardViewController : UIViewController<UITextFieldDelegate>


@property (retain, nonatomic) IBOutlet UITextField *textField1;
@property (retain, nonatomic) IBOutlet UITextField *textField2;

并在 .m 位置而不是此代码

        textField1.inputAccessoryView  = keyboardToolbar;
        textField2.inputAccessoryView  = keyboardToolbar;

粘贴这些代码

for (id view in self.view.subviews) 
    if ([view isKindOfClass:[UITextField class]]) 
        [(UITextField *)view setInputAccessoryView:keyboardToolbar];
    

粘贴这段代码

-(void) resignKeyboard:(id)sender

         [self.view endEditing:YES];

而不是这个

-(void) resignKeyboard:(id)sender
    
        if ([textField1 isFirstResponder])
            [textField1 resignFirstResponder];

        else if ([textField2 isFirstResponder])
        [textField2 resignFirstResponder];
    

在 viewDidLoad 方法中添加这段代码

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

-(void)nextField:(id)sender

    if ([textField1 isFirstResponder]) 

        [textField2 becomeFirstResponder];
        [previousButton setEnabled:YES];
        [nextButton setEnabled:NO];
    


-(void)previousField:(id)sender

    if ([textField2 isFirstResponder]) 

        [textField1 becomeFirstResponder];
        [nextButton setEnabled:YES];
        [previousButton setEnabled:NO];
    


-(void)keyboardWillShow:(id)sender

    if ([textField2 isFirstResponder]) 

        [nextButton setEnabled:NO];
        [previousButton setEnabled:YES];
    else if ([textField1 isFirstResponder]) 

        [nextButton setEnabled:YES];
        [previousButton setEnabled:NO];
    

【讨论】:

巴拉,非常感谢您的回复。我会试试的。感谢您的帮助! 巴拉,我把所有的代码都改了,谢谢!我现在使用我的上一个、下一个和完成按钮获得工具栏。完成按钮有效,但不是上一个和下一个。我是否需要在我的头文件中为它们提供属性?或者我的选择器不正确。再次感谢您的帮助! [[NSNotificationCenter defaultCenter] addObserver:self 选择器:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];只需将其添加到您的 viewDidLoad 方法中 巴拉,我把它放在 [super viewDidLoad] 之后吗?还是我把它放在 if 语句中。现在它在 if 语句中,我得到一个错误。对此真的很抱歉,但我是个菜鸟。我正在尝试让这个应用程序工作,这样我就可以把它交给我的学生来帮助他们做一些计算!再次感谢。 巴拉。抱歉,但这给了我一个 sigabrt 错误。等等,我刚刚看到你发布的其他一些内容!会再修!!! UUGGGHHH,我希望我更聪明!【参考方案2】:

当您的文本字段类型为 UIKeyboardTypeNumberPad 时,当您要添加“完成按钮”时,UIToolbar 非常有用。这是因为默认情况下它没有完成按钮。为此,您只需添加以下内容:-

    UIToolbar *boolbar = [UIToolbar new];
    boolbar.barStyle = UIBarStyleBlackTranslucent;
    [boolbar sizeToFit];


    UIBarButtonItem *leftBarButton =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneBtnClicked)];

    NSArray *array = [NSArray arrayWithObjects:cancelleftBarButton, nil];
    [leftBarButton release];
    [boolbar setItems:array];

    textField_phnNumber.inputAccessoryView = boolbar;

//选择器执行的方法

-(void)doneBtnClicked

[textField_phnNumber resignFirstResponder];

注意:-如果您使用的是 UITextField,请将其添加到 textFieldDidBeginEditing 委托方法中。

【讨论】:

Arshad,我的完成按钮现在可以使用了。但不是其他两个?知道我哪里出错了吗?我遵循了 Bala 的所有代码更正。感谢所有的帮助。 可能是这些按钮上的选择器(方法)不起作用。尝试查看这些按钮执行的方法。尝试使用调试器和 NSLog。【参考方案3】:

此代码在键盘上方 UIToolbar 的 右侧 侧创建“完成”按钮:

UIToolbar *tbAboveKeyboard = [[UIToolbar alloc] init];
tbAboveKeyboard.barStyle = UIBarStyleBlackTranslucent;
[tbAboveKeyboard sizeToFit];

UIBarButtonItem *flexibleSpaceLeft = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

UIBarButtonItem *rightBarButton =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneButtonClicked:)];

NSArray *array = [NSArray arrayWithObjects:flexibleSpaceLeft, rightBarButton, nil];
[rightBarButton release];
[tbAboveKeyboard setItems:array];

yourTextView.inputAccessoryView = tbAboveKeyboard;
[tbAboveKeyboard release];  

...

- (void)doneButtonClicked:(id)sender

    [searchTextField resignFirstResponder];

【讨论】:

感谢您的回答!有人可以将答案翻译成 swift 代码吗?

以上是关于在 Xcode 4.3 中的键盘上放置一个 UIToolbar的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 4.5 与 iOs 6 在 iOs 4.3 中的问题

XCode 4.3 剪贴板中的文本自动在 TextView 中输入

在 xcode 4.3 上添加 iphone sdk 6.1

如何在 Xcode 4.3 上使用 JavaScript?

libtool 在 XCode 4.3 上失败,退出代码为 1

如何在 Xcode 4.3 上查看复制到 build 文件夹的 asstes?