2014-02-09 30 views
1

我想利用inputAccessoryView并显示帮助文本和上一个和下一个按钮。不过,我有许多跨越许多ViewControllers的UITextFields。所以我想为inputAccessoryView有一个可重用的UIView。使用inputAccessoryView与多个UITextFields和ViewControllers

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

SetupKeyboardAccessory

enter image description here

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开发还很陌生。所以任何帮助,将不胜感激。谢谢!

+0

helpTextLabel插座是否连接到xib文件中的相应标签? – Gudiya

+0

感谢Laddu的回复,它正确连接到正确的标签。我做了更多的挖掘,事实证明,它自己的标签在视图控制器初始化之后是零。我已在下面发布了一个答案,并提供了更多细节 – KrispyDonuts

回答

2

这不是适当的,为实例化视图的唯一目的创建一个视图控制器,只则丢弃该视图控制器。

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

SetupKeyboardAccessoryView *accessoryView = [[[NSBundle mainBundle] loadNibNamed:@"SetupKeyboardAccessoryView" owner:nil options:nil] firstObject] 
+0

啊,这简单得多。我知道我做这件事的方式有些不同。不知道有可能将UILabels和UIButtons作为出口连接到UIView的子类。谢谢詹姆斯。 – KrispyDonuts

+0

但是,我可以看到希望为附件视图设置单独的视图控制器。 – pkamb

2

找出一点点挖掘后的问题。当我试图设置文本helpTextLabelhelpTextLabel本身是零。

这是由于在未完全实例化视图控制器视图之前未设置网点。 (来源:https://stackoverflow.com/a/4005968/986105

所以在我SetupKeyboardAccessoryViewController.m文件,我说我自己的初始化函数:(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; 
}