将 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上方(不是底部)