2013-08-23 3 views
4

У меня есть динамическое число UITextFields, у которого все есть inputAccessoryView. Он состоит из UIToolbar, на котором есть кнопка. Когда эта кнопка нажата, она вызывает метод, однако в этом методе мне как-то нужна возможность доступа к базовому UITextField.Как получить UITextField из кнопки InputAccessoryView нажмите

Возможно, кто-нибудь посоветует, как это возможно?

// Create the toolbar controls 
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(navigationBarDoneButtonPressed:)]; 
UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 

// Setup the toolbar 
navigationToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(10.0, 0.0, 310.0, 40.0)]; 
[navigationToolbar setItems:@[flexibleSpace, doneButton]]; 

// In a UITableView I create a number of cells which contain UITextFields.... 

// This is the method that gets called when a user presses the done button 
- (void)navigationBarDoneButtonPressed:(id)sender 
{ 
    NSLog(@"Based on sender I need to access the underlying UITextField."); 
} 
+0

Я добавил код, в котором суммируется то, что я сделал. –

ответ

6

Вы можете следить в настоящее время сосредоточены UITextField в переменной и использовать эту переменную в вашем inputAccesoryView методе:

в вашем файле .h: убедитесь, что вы в соответствии с протоколом UITextFieldDelegate:

@interface MyViewController : UIViewController <UITextFieldDelegate> 

и добавить это свойство:

@property (assign, nonatomic) UITextField *activeTextField; 

В вашем .m файла: При создании динамических текстовых полей:

... 
theTextField.delegate=self; 
... 

И добавить эти реализаций UITextFieldDelegate протокола:

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    self.activeTextField = textField; 
} 
- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    self.activeTextField = nil; 
} 

И теперь, в методе вызывается вашим inputAccesoryView:

- (void)navigationBarDoneButtonPressed:(id)sender{//Just an example 
    [email protected]"Test"; 
} 
+0

Спасибо за помощь. К сожалению, я не могу использовать этот шаблон, хотя, поскольку методы делегата UITextField уже используются UITableViewCell, который его содержит (другими словами, UITableViewCell устанавливается как делегат UITextField). –

+0

@ TheCrazyChimp в порядке, если это не решение, вы можете использовать решение, которое объясняется здесь: http://stackoverflow.com/questions/1823317/get-the-current-first-responder-without-using-a-private -api и использовать его в таблицеView внутри метода inputAccesoryView. Это даст вам UIView, который имеет фокус. –

+0

Спасибо - я использовал вашу идею. В основном я создал метод делегата в подклассе UITableViewCell, который запускался всякий раз, когда кто-то начинает редактировать UITextField внутри него. Таким образом, я смог сохранить запись используемого текстового поля. –

0

Я бы создал подкласс UITableViewCell с делегатом, например

MyTextEditTableViewCell.h

@class MyTextEditTableViewCell; 
@protocol MyTextEditTableViewCellDelegate <NSObject> 
- (void)didDoneButtonPressed:(MyTextEditTableViewCell *)sender; 
@end 

@interface MyTextEditTableViewCell : UITableViewCell 
@property (nonatomic, weak) id<MyTextEditTableViewCellDelegate> delegate; 
@property (nonatomic, strong) UITextField *textField; 
@end 

MyTextEditTableViewCell.m

@implementation MyTextEditTableViewCell 
- (void)navigationBarDoneButtonPressed:(id)sender 
{ 
    // Call delegate 
    if (self.delegate) 
      [self.delegate didDoneButtonPressed:self]; 
} 
@end 

Ваш UIViewController подкласс (или UITableViewController)

... 
- (void)didDoneButtonPressed:(MyTextEditTableViewCell *)sender { 
    UITextField *cellTextField = sender.textField; 
    // do some stuff with text field 
} 

Не забудьте установить делегата в ячейку, когда вы будете настройте его.

Смежные вопросы