添加UIToolbar以在某些文本字段上输入附件视图 [英] Adding UIToolbar to input accessory view on some text fields

查看:77
本文介绍了添加UIToolbar以在某些文本字段上输入附件视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在寻求我的第一个iPhone应用程序时,我发布了有关处理iOS键盘上的回车键的正确方法的信息.现在,我需要弄清楚带有上一个/下一个和完成按钮的键盘上方的工具栏.我一直在使用以下站点的示例: 输入附件视图

In my quest for my first iPhone app I have posted about the correct way to handle the return key on the iOS keyboard. Now I need to figure out the toolbar above the keyboard with prev/next and done buttons. I have been working with an example from the following site: Input Accessory View

该示例有效,但我想使用UIToolbar和UIBarButtonItem而不是仅使用按钮的常规视图.我已经尝试了各种组合,但都没有用.这是我到目前为止所拥有的.

The example works, but I want to use a UIToolbar and UIBarButtonItem's instead of just a regular view with buttons. I have tried various combinations, none work yet. Here is what I have so far.

标题:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>
{
    UITextField* txtActiveField;
    UIToolbar* keyboardToolbar;
    UIBarButtonItem* btnDone;
    UIBarButtonItem* btnNext;
    UIBarButtonItem* btnPrev;
}

@property (nonatomic, strong) IBOutlet UITextField* firstNameTextField;
@property (nonatomic, strong) IBOutlet UITextField* lastNameTextField;
@property (nonatomic, strong) IBOutlet UITextField* cityTextField;

@property (nonatomic, strong) UITextField* txtActiveField;
@property (nonatomic, strong) UIToolbar* keyboardToolbar;
@property (nonatomic, strong) UIBarButtonItem* btnDone;
@property (nonatomic, strong) UIBarButtonItem* btnNext;
@property (nonatomic, strong) UIBarButtonItem* btnPrev;

-(void)createInputAccessoryView;

@end

来源:

#import "ViewController.h"

@implementation ViewController

@synthesize firstNameTextField = _firstNameTextField;
@synthesize lastNameTextField = _lastNameTextField;
@synthesize cityTextField = _cityTextField;

@synthesize txtActiveField = _txtActiveField;
@synthesize keyboardToolbar = _keyboardToolbar;
@synthesize btnDone = _btnDone;
@synthesize btnNext = _btnNext;
@synthesize btnPrev = _btnPrev;

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self createInputAccessoryView];
}

- (void)viewDidUnload
{
    [self setFirstNameTextField:nil];
    [self setLastNameTextField:nil];
    [self setCityTextField:nil];

    [self setTxtActiveField:nil];
    [self setKeyboardToolbar:nil];
    [self setBtnDone:nil];
    [self setBtnNext:nil];
    [self setBtnPrev:nil];

    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

-(void)gotoPrevTextfield
{
    if (self.txtActiveField == self.firstNameTextField)
    {
        return;
    }
    else if (self.txtActiveField == self.lastNameTextField)
    {
        [self.firstNameTextField becomeFirstResponder];
    }
    else if (self.txtActiveField == self.cityTextField)
    {
        [self.lastNameTextField becomeFirstResponder];
    }           
}

-(void)gotoNextTextfield
{
    if (self.txtActiveField == self.firstNameTextField)
    {
        [self.lastNameTextField becomeFirstResponder];
    }
    else if (self.txtActiveField == self.lastNameTextField)
    {
        [self.cityTextField becomeFirstResponder];
    }
    else if (self.txtActiveField == self.cityTextField)
    {
        return;
    }           
}

-(void)doneTyping
{
    [self.txtActiveField resignFirstResponder];
}

-(void)createInputAccessoryView
{
    self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)];
    self.keyboardToolbar.barStyle = UIBarStyleBlackTranslucent;
    self.keyboardToolbar.tintColor = [UIColor darkGrayColor];

    btnPrev = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:@selector(gotoPrevTextfield:)];
    btnNext = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:@selector(gotoNextTextfield:)];
    btnDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneTyping:)];

    [self.keyboardToolbar addSubview:(UIView*)btnPrev];
    [self.keyboardToolbar addSubview:(UIView*)btnNext];
    [self.keyboardToolbar addSubview:(UIView*)btnDone];

    [self.firstNameTextField setInputAccessoryView:self.keyboardToolbar];
    [self.lastNameTextField setInputAccessoryView:self.keyboardToolbar];
    [self.cityTextField setInputAccessoryView:self.keyboardToolbar];
}

-(void)textFieldDidBeginEditing:(UITextField*)textField
{
    self.txtActiveField = textField;
}
@end

启动应用程序时,我得到:

When I start the application I get:

012-01-21 09:31:19.798 KeyboardToolbar[14772:f803] -[UIBarButtonItem superview]: unrecognized selector sent to instance 0x6b19350
2012-01-21 09:31:19.799 KeyboardToolbar[14772:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIBarButtonItem superview]: unrecognized selector sent to instance 0x6b19350'
*** First throw call stack:
(0x13bc052 0x154dd0a 0x13bdced 0x1322f00 0x1322ce2 0x5042f 0x4a72b 0x3422 0x2a58 0xd964e 0x39a73 0x39ce2 0x39ea8 0x40d9a 0x11be6 0x128a6 0x21743 0x221f8 0x15aa9 0x12a6fa9 0x13901c5 0x12f5022 0x12f390a 0x12f2db4 0x12f2ccb 0x122a7 0x13a9b 0x2728 0x2685 0x1)
terminate called throwing an exception

我的假设是我没有正确分配元素之一.我也想知道是否需要在类中为按钮添加字段,或者是否可以将其添加到工具栏.而且我在标题中放置了一行,这样我就不必将所有方法都放在文件的开头.尚不知道像在C语言中一样可以向前声明方法的语法.

My assumption is that I have not allocated one of the elements correctly. I also wonder if I need to have fields in the class for the buttons or if those can just be added to the toolbar. And I put a line in the header so that I would not have to put all my methods at the beginning of the file. Don't know the syntax yet to forward declare a method like you could do in C.

谢谢.

更新:

因此,我对createInputAccessoryView进行了一些更改.我现在使用addItems添加按钮.我将按钮变量设置为局部变量(但与以前一样,存在相同的问题).好消息是该应用程序不再崩溃,坏消息是该工具栏显示了,但是没有任何按钮.不知道我还需要做些什么才能使按钮真正显示出来.我所看到的所有例子都是相似的.

So I made some changes to the createInputAccessoryView. I am using addItems now to add the buttons. I made the button variables local (but had the same problem when they were as before). Good news is that the app does not crash anymore, bad news is that the toolbar shows, but without any buttons. Not sure what else I need to do to get the buttons to actually show. All the examples I have seen are similar.

-(void)createInputAccessoryView
{
    self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)];
    self.keyboardToolbar.barStyle = UIBarStyleBlackTranslucent;
    self.keyboardToolbar.tintColor = [UIColor darkGrayColor];

    UIBarButtonItem* previousButton = [[UIBarButtonItem alloc] initWithTitle:@"Previous" style:UIBarButtonItemStyleBordered target:self action:@selector(gotoPrevTextfield)];
    UIBarButtonItem* nextButton = [[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStyleBordered target:self action:@selector(gotoNextTextfield)];
    UIBarButtonItem* flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneTyping:)];

    [keyboardToolbar setItems:[NSArray arrayWithObjects: previousButton, nextButton, flexSpace, doneButton, nil] animated:NO];

    [self.firstNameTextField setInputAccessoryView:self.keyboardToolbar];
    [self.lastNameTextField setInputAccessoryView:self.keyboardToolbar];
    [self.cityTextField setInputAccessoryView:self.keyboardToolbar];
}

推荐答案

UIBarButtonItem不是UIView子类,因此您不能将其添加为UIToolbar的子视图.而是使用工具栏上的– setItems:animated:方法添加这些按钮.

UIBarButtonItem isn't a UIView subclass, so you can't add it as a subview of the UIToolbar. Instead, use the – setItems:animated: method on your toolbar to add those buttons.

这篇关于添加UIToolbar以在某些文本字段上输入附件视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆