将 inputAccessoryView - UIToolBar 上的 UITextField 中的文本镜像到 navigationController.toolbar 上 UITextField 上

Posted

技术标签:

【中文标题】将 inputAccessoryView - UIToolBar 上的 UITextField 中的文本镜像到 navigationController.toolbar 上 UITextField 上的文本【英文标题】:Mirror text from UITextField on inputAccessoryView - UIToolBar to text on UITextField on navigationController.toolbar 【发布时间】:2013-10-24 22:22:47 【问题描述】:

在我的应用中,navigationController 工具栏上有一个 UITextField。

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic,strong) NSArray *toolBarButtonItems;
@property (nonatomic,strong) UITextField *textField;
@property (nonatomic,strong) UITextField *textField2;

@end

@implementation ViewController

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.textField = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 60, 40)];
    self.textField.delegate = self;
    self.textField.borderStyle = UITextBorderStyleRoundedRect;

    UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc]initWithCustomView:self.textField];

    self.toolBarButtonItems = @[flexibleSpace,barButtonItem,flexibleSpace];

    self.toolbarItems = self.toolBarButtonItems;
    self.navigationController.toolbar.barTintColor = [UIColor blueColor];

    [self.navigationController setToolbarHidden:NO animated:NO];

当点击 textField 时,键盘打开,我用另一个 textField 创建了一个新的 inputAccessoryView 工具栏。

-(UIToolbar *)addToolBar
    UIToolbar *toolbar = [[UIToolbar alloc]initWithFrame:self.navigationController.toolbar.frame];
    toolbar.barTintColor = [UIColor darkGrayColor];

    self.textField2 = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 60, 40)];
    self.textField2.delegate = self;
    self.textField2.borderStyle = UITextBorderStyleRoundedRect;

    UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc]initWithCustomView:self.textField2];

    [toolbar setItems:@[flexibleSpace,barButtonItem,flexibleSpace]];
    return toolbar;

想法是将 firstResponder 更改为 inputAccessoryView 上的 textField,这样我就可以看到我正在编辑的内容。我这样做的原因是我无法将导航工具栏向上滚动到键盘上方,并且我想查看正在编辑的文本。

-(void)textFieldDidBeginEditing:(UITextField *)textField
    textField.inputAccessoryView = [self addToolBar];

    if(self.textField2.isFirstResponder != NO)
        [self.textField2 becomeFirstResponder];
    

当我单击 navigationController 工具栏中的 textField 时,它似乎不起作用。新的 inputAccessoryView 工具栏显示在键盘上,但我无法编辑该字段,因为响应者似乎没有改变。返回键也不起作用。我必须按两次才能关闭键盘,当我这样做时,两个文本字段之间的文本不匹配。

-(BOOL)textFieldShouldReturn:(UITextField *)textField
    [textField resignFirstResponder];
    self.textField.text = self.textField2.text;
    return YES;

【问题讨论】:

【参考方案1】:

我让它像这样工作:

#import "KJMViewController.h"

@interface KJMViewController ()

@property (strong, nonatomic) UITextField *textField1;
@property (strong, nonatomic) UITextField *textField2;

@end

@implementation KJMViewController

- (void)viewDidLoad

    [super viewDidLoad];

    self.textField1 = [[UITextField alloc]initWithFrame:CGRectMake(30, 7, 260, 30)];
    self.textField1.borderStyle = UITextBorderStyleRoundedRect;
    self.textField1.delegate = self;
    UIToolbar *navToolbar = self.navigationController.toolbar;
    [navToolbar addSubview:self.textField1];

    UIToolbar *toolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)];
    self.textField2 = [[UITextField alloc]initWithFrame:CGRectMake(30, 7, 260, 30)];
    self.textField2.borderStyle = UITextBorderStyleRoundedRect;
    self.textField2.delegate = self;
    [toolbar addSubview:self.textField2];
    self.textField1.inputAccessoryView = toolbar;
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(firstRes:) name:UIKeyboardDidShowNotification object:nil];


- (void)firstRes:(id)sender

    [self.textField2 becomeFirstResponder];


- (void)textFieldDidEndEditing:(UITextField *)textField




- (BOOL)textFieldShouldReturn:(UITextField *)textField

    if (textField == self.textField2) 
        self.textField1.text = self.textField2.text;
    
    [textField resignFirstResponder];
    [self.textField1 resignFirstResponder];
    return YES;


- (void)viewDidDisappear:(BOOL)animated

    [[NSNotificationCenter defaultCenter]removeObserver:self forKeyPath:UIKeyboardDidShowNotification];
    [super viewDidDisappear:animated];


@end

这是viewDidLoad 发生的事情:

初始化工具栏和 textField2 在此处为 textField1(键盘隐藏的那个)设置 inputAccessory,以便它可以成为 firstResponder

然后在viewDidAppear方法中:

注册接收在显示键盘时发送的通知。然后,您将在“firstRes”方法中编写一些代码,以使 textField2 成为 firstResponder。您需要使用此通知使其成为 firstResponder,因为您知道此时它在视图层次结构中,这意味着它能够成为 firstResponder。在-(void)textFieldDidBeginEditing:(UITextField *)textField 中调用它似乎会在 textField2 出现在屏幕上之前触发它,这意味着它不能成为 firstResponder。我们在viewDidAppear 方法中注册它,因为我们只想在屏幕上收到通知。

textField2 resignsFirstResponder 后,textField1 再次成为第一响应者,所以你必须在textFieldShouldReturn 方法中调用 resignFirstResponder 两次。

另外,如果我们离开屏幕,我们需要在viewDidDisappear 方法中移除自己作为键盘通知的观察者。

这是我在 Xcode 中创建的项目的链接,您可以了解它是如何工作的:

https://github.com/kylejm/UIToolBar-UITextView

【讨论】:

不起作用。现在,您的代码中还有 4 个文本字段属性。为什么需要另外两个文本字段?您只声明了两个属性,但您在代码中使用了 4(textField、textField1、textField2、inputTF)。另外,你为什么要在 ios7 中使用 iVars? 哦,对我有用。我并不是要写“textField”和“inputTF”——我在深夜写了代码,只是在将属性名称更改为您在写我的答案时使用的名称时忽略了它们。属性是 iVar,它们只是用来让 Xcode 自动生成访问器方法。 我现在已经编辑了我的答案,所以使用了正确的属性名称,希望它现在对你有用。 谢谢,但它似乎仍然无法正常工作。 viewDidLoad 方法中的 self.inputTF 是什么?此外,您的代码中不再有 navigationController 工具栏。你为什么要这么做?您是否也将 TextField1 的 inputAccessoryView 设为 navigationController 工具栏? 让我们continue this discussion in chat

以上是关于将 inputAccessoryView - UIToolBar 上的 UITextField 中的文本镜像到 navigationController.toolbar 上 UITextField 上的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UICollectionView 添加到 inputAccessoryView

swift如何将inputAccessoryView停靠在UIToolbar上方(不是底部)

将 inputAccessoryView 与多个 UITextField 和 ViewController 一起使用

将 InputAccessoryView 设置为 UISearchController

将 UITextField 的 inputAccessoryView 设置为其父视图

将视图用作 inputAccessoryView 时如何防止键盘添加自己的高度约束