2014-02-09 1 views
1

inputAccessoryView를 활용하고 도움말 텍스트와 이전 및 다음 버튼을 표시하려고합니다. 그러나 많은 ViewControllers 걸쳐 많은 UITextFields 있습니다. 그래서 inputAccessoryView에 대한 재사용 가능한 UIView를 갖고 싶습니다.여러 UITextField 및 ViewControllers와 함께 inputAccessoryView 사용

이렇게하려면 xib 파일 ('SetupKeyboardAccessory')과 해당 xib에 연결된 ViewController ('SetupKeyboardAccessoryViewController')를 만들었습니다.

SetupKeyboardAccessory :

enter image description here

SetupKeyboardAccessoryViewController : 내 MainViewController 내부

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

내가 내 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로 설정합니다. 어떤 이유로 도움말 텍스트가 설정되지 않습니다.

나는 아마도 여기에 뭔가 잘못된 일을하고있는 것으로 알고있다. SetupAccessoryView에 대한 SetupKeyboardAccessoryViewController의 뷰를 설정하고있다. 나는 여전히 iOS 개발에 대해 상당히 새로운 것이다. 그래서 어떤 도움을 주시면 감사하겠습니다. 고맙습니다!

+0

xip 파일의 적절한 레이블에 'helpTextLabel'콘센트가 연결되어 있습니까? – Gudiya

+0

레스 폰을 보내 주셔서 감사합니다. 정확한 라벨에 정확하게 연결됩니다. 나는 좀 더 파고 들었고보기 컨트롤러가 초기화 된 후에 자체 라벨이 없다는 것을 알게되었습니다. 나는 아래에 더 자세한 내용을 게시했다. – KrispyDonuts

답변

2

.

SetupKeyboardAccessoryView 클래스가 UIView의 하위 클래스 인 경우 코드가 훨씬 간단합니다.그런 다음 nib 파일에서이 클래스의 뷰를 만들고 다음과 같이 인스턴스화했습니다.

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

아, 그게 훨씬 간단합니다. 내가 그 일을하는 방식으로 무언가가 떨어져 있다는 것을 알았다. UILabels과 UIButton을 아웃렛으로 UIView의 하위 클래스에 연결할 수 있다는 것을 알지 못했습니다. 감사합니다 제임스. – KrispyDonuts

+0

그러나 액세서리보기에 별도의보기 컨트롤러가있는 것을 볼 수 있습니다. – pkamb

2

조금 파고 나서 문제가 무엇인지 알아 냈습니다. helpTextLabel이라는 텍스트를 설정할 때 helpTextLabel 자체가 nil 인 것으로 나타났습니다.

이것은 뷰 컨트롤러보기가 완전히 인스턴스화 될 때까지 콘센트가 설정되지 않기 때문입니다. (출처 : https://stackoverflow.com/a/4005968/986105) : (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil withHelpText:(NSString*)helpText

그리고있는 viewDidLoad 기능에, 내가 UILabel의 텍스트를 설정합니다

그래서 내 SetupKeyboardAccessoryViewController.m 파일에, 나는 내 자신의 초기화 기능을 추가했습니다.

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; 
} 
관련 문제