在Xcode 4.3中将UIToolbar放置在键盘上方

3

这是我的第一篇文章,我对iOS编程还比较陌生。我正在使用xcode 4.3,并有一个很简单的问题:如何在键盘上方放置一个带有上/下按钮的工具栏。我已经找了很多教程来解决这个问题,但这些教程大多针对interface builder的旧版本。我在网上和苹果开发者网站上找到了一些代码,但现在遇到了错误:“assignment to readonly property”,说明我的代码可能有问题。我知道问题可能很简单,但由于从旧版本移植代码到新版本时可能出现问题,导致现在不知道哪里出了差错。请有经验的人士检查一下我的代码并指出问题所在,非常感谢。我已经包含了我的.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
3个回答

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

Bala,非常感谢您的回复。我会尝试一下。感谢您的帮助! - Douglas
抱歉,但是这给了我一个sigabrt错误。等等,我刚刚看到你发布的其他一些东西!我会再次修复的!!!唉,我希望我更聪明! - Douglas
哦,抱歉那是我的错误。我已经编辑过了,请您现在检查一下。 - Bala
Bala,按钮仍然无法使用。它不允许我在[nextbutton setenable:no]等中使用变量nextbutton,因为我已经使用过它了。 - Douglas
如果答案正确,您应该接受它,别忘了! - Bala
显示剩余6条评论

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的所有代码更正。感谢你的帮助。 - Douglas
也许这些按钮上的选择器(方法)不起作用了。尝试查看这些按钮正在执行的方法。请尝试使用调试器和 NSLog。 - Arshad Parwez

0
这段代码在键盘上方的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 代码吗? - Panos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接