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

Posted

技术标签:

【中文标题】将 inputAccessoryView 与多个 UITextField 和 ViewController 一起使用【英文标题】:Use inputAccessoryView with multiple UITextFields and ViewControllers 【发布时间】:2014-02-09 20:20:19 【问题描述】:

我正在尝试利用 inputAccessoryView 并显示帮助文本以及上一个和下一个按钮。但是,我有许多 UITextFields 跨越许多 ViewControllers。所以我想为 inputAccessoryView 提供一个可重用的 UIView。

为此,我创建了一个 xib 文件 ('SetupKeyboardAccessory') 和一个附加到该 xib 的 ViewController ('SetupKeyboardAccessoryViewController')。

SetupKeyboardAccessory

SetupKeyboardAccessoryViewController

@interface SetupKeyboardAccessoryViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *helpTextLabel;
@property (weak, nonatomic) IBOutlet UIButton *previousButton;
@property (weak, nonatomic) IBOutlet UIButton *nextButton;
@end

在我的 MainViewController 中,我有我的 UITextFields。这个 MainViewController 正在实现 UITextFieldDelegate:

MainViewController

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField


    // you can create the accessory view programmatically (in code), or from the storyboard
    if (textField.inputAccessoryView == nil) 
        SetupKeyboardAccessoryViewController *accessoryView =
        [[SetupKeyboardAccessoryViewController alloc] initWithNibName:@"SetupKeyboardAccessory"
                                                bundle:nil];
        accessoryView.helpTextLabel.text = @"setting help text here";
        textField.inputAccessoryView = accessoryView.view;
    

    //self.navigationItem.rightBarButtonItem = self.doneButton;

    return YES;


- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 

    [textField resignFirstResponder];

    return YES;

当文本字段开始编辑时,我初始化我的 SetupKeyboardAccessoryViewController,设置帮助文本,然后将其设置为 inputAccessoryView。由于某种原因,帮助文本未设置。

我知道我可能在将 SetupKeyboardAccessoryViewController 的视图设置为 inputAccessoryView 时做错了。我对 ios 开发还很陌生。所以任何帮助将不胜感激。谢谢!

【问题讨论】:

helpTextLabel 出口是否连接到 xib 文件中的适当标签? 感谢 Laddu 的回复,它已正确连接到正确的标签。我做了更多的挖掘,结果发现它自己的标签在视图控制器初始化后是 nil 。我在下面发布了一个包含更多详细信息的答案。 【参考方案1】:

仅仅为了实例化视图而创建视图控制器是不合适的,然后丢弃视图控制器。

如果您只有一个 SetupKeyboardAccessoryView 类,它是 UIView 的子类,您的代码会简单得多。然后在 nib 文件中创建这个类的视图,并用 :

实例化它
SetupKeyboardAccessoryView *accessoryView = [[[NSBundle mainBundle] loadNibNamed:@"SetupKeyboardAccessoryView" owner:nil options:nil] firstObject]

【讨论】:

啊,这简单多了。我知道我做这件事的方式有些不对劲。不知道可以将 UILabel 和 UIButtons 作为插座连接到 UIView 的子类。谢谢詹姆斯。 我可以看到希望为附件视图拥有一个单独的视图控制器。【参考方案2】:

经过一番挖掘,找出了问题所在。当我试图设置helpTextLabel 的文本时,helpTextLabel 本身是零。

这是由于在视图控制器视图完全实例化之前没有设置出口。 (来源:https://***.com/a/4005968/986105)

所以在我的 SetupKeyboardAccessoryViewController.m 文件中,我添加了自己的 init 函数:(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil withHelpText:(NSString*)helpText

然后在 viewDidLoad 函数中,我会设置 UILabel 的文本。

SetupKeyboardAccessoryViewController.m:

@interface SetupKeyboardAccessoryViewController ()

    NSString* helperText;

@end

@implementation SetupKeyboardAccessoryViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil withHelpText:(NSString*)helpText

    self = [self initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization
    

    helperText = helpText;
    return self;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization
    
    return self;


- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.helpTextLabel.text = helperText;


- (IBAction)previousButton:(id)sender 
    NSLog(@"prev button pressed");


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


@end

所以在我的 MainViewController 中,我只需调用我的 init 函数并删除该行来设置 UILabel 的文本。

MainViewController:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField


    // you can create the accessory view programmatically (in code), or from the storyboard
    if (textField.inputAccessoryView == nil) 
        SetupKeyboardAccessoryViewController *accessoryView =
        [[SetupKeyboardAccessoryViewController alloc] initWithNibName:@"SetupKeyboardAccessory"
                                                bundle:nil withHelpText:@"setting help text here"];
        textField.inputAccessoryView = accessoryView.view;
    

    //self.navigationItem.rightBarButtonItem = self.doneButton;

    return YES;


- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 

    [textField resignFirstResponder];

    return YES;

【讨论】:

以上是关于将 inputAccessoryView 与多个 UITextField 和 ViewController 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

inputAccessoryView 类似 iOS Mail

如何将 UILabel 放在键盘的“inputAccessoryView”中?

如何将 UICollectionView 添加到 inputAccessoryView

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

将 InputAccessoryView 设置为 UISearchController

将 UITextField 的 inputAccessoryView 设置为其父视图