2014-02-09 74 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; 
}