【问题标题】:Use inputAccessoryView with multiple UITextFields and ViewControllers将 inputAccessoryView 与多个 UITextField 和 ViewController 一起使用
【发布时间】: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 。我在下面发布了一个包含更多详细信息的答案。

标签: ios objective-c uitextfield


【解决方案1】:

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

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

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

【讨论】:

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

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

这是由于在视图控制器视图完全实例化之前没有设置出口。 (来源:https://stackoverflow.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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多