Ios 如何从inputAccessoryView按钮中获取UITextField单击

Ios 如何从inputAccessoryView按钮中获取UITextField单击,ios,objective-c,uitextfield,uitoolbar,Ios,Objective C,Uitextfield,Uitoolbar,我有一个动态的UITextFields,它们都有一个inputAccessoryView。它由一个带有按钮的UIToolbar组成。当按下此按钮时,它会调用一个方法,但是,在这个方法中,我不知何故需要能够访问底层的UITextField 有人能告诉我这是怎么可能的吗 // Create the toolbar controls UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UI

我有一个动态的
UITextFields
,它们都有一个
inputAccessoryView
。它由一个带有按钮的
UIToolbar
组成。当按下此按钮时,它会调用一个方法,但是,在这个方法中,我不知何故需要能够访问底层的
UITextField

有人能告诉我这是怎么可能的吗

// 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.");
}

您可以在变量中跟踪当前关注的
UITextField
,并在
InputAccessoryView
方法中使用该变量:

在.h文件中:确保符合
UITextFieldDelegate
协议:

@interface MyViewController : UIViewController <UITextFieldDelegate>
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    self.activeTextField = textField;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
    self.activeTextField = nil;
}
在.m文件中:创建动态文本字段时:

...
theTextField.delegate=self;
...
并添加以下
UITextFieldDelegate
协议的实现:

@interface MyViewController : UIViewController <UITextFieldDelegate>
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    self.activeTextField = textField;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
    self.activeTextField = nil;
}
现在,在您的
InputAccessoryView调用的方法中:

- (void)navigationBarDoneButtonPressed:(id)sender{//Just an example
    self.activeTextField.text=@"Test";
}

我会用delegate创建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
UIViewController子类(或UITableViewController)


在配置时,不要忘记将委托设置为单元格

我添加了一些代码,总结了我所做的工作。谢谢你的帮助。不幸的是,我无法使用此模式,因为包含它的UITableViewCell已经在使用UITextField委托方法(换句话说,UITableViewCell被设置为UITextField的委托)。@TheCrazyChimp ok,如果这不是一个解决方案,您可以使用此处解释的解决方案:,并在InputAccessoryView方法的tableView中使用它。这将为您提供具有焦点的UIView。谢谢-我使用了您的想法。基本上,我在子类UITableViewCell上创建了一个委托方法,每当有人开始编辑其中的UITextField时就会触发该方法。这样,我就能够维护正在使用的文本字段的记录。
...
- (void)didDoneButtonPressed:(MyTextEditTableViewCell *)sender {
    UITextField *cellTextField = sender.textField;
    // do some stuff with text field
}