Iphone 获取所有UITextFields的数组
如何获取视图控制器中所有UITextFields的数组Iphone 获取所有UITextFields的数组,iphone,objective-c,ios5,Iphone,Objective C,Ios5,如何获取视图控制器中所有UITextFields的数组 编辑:我不想将文本字段硬编码到数组中。实际上,我想从该代理的调用者那里获取代理内部所有字段的列表。您可以在控制器视图的子视图中循环 下面是一个粗略的例子: NSMutableArray *arrOfTextFields = [NSMutableArray array]; for (id subView in self.view.subviews) { if ([subView isKindOfClass:[UITextField c
编辑:我不想将文本字段硬编码到数组中。实际上,我想从该代理的调用者那里获取代理内部所有字段的列表。您可以在控制器视图的子视图中循环 下面是一个粗略的例子:
NSMutableArray *arrOfTextFields = [NSMutableArray array];
for (id subView in self.view.subviews)
{
if ([subView isKindOfClass:[UITextField class]])
[arrOfTextFields addObject:subView];
}
编辑不带全局变量的递归(仅适用于Tim)
用于搜索所有子视图的子视图的递归实现:(这样可以捕获嵌入在uiscrollview中的文本字段,等等)
如果您知道需要一个包含所有
UITextField
的NSArray
,那么为什么不将它们添加到数组中呢
NSMutableArray *textFields = [[NSMutableArray alloc] init];
UITextField *textField = [[UITextField alloc] initWithFrame:myFrame];
[textFields addObject:textField]; // <- repeat for each UITextField
然后将所有的
UITextField
连接到该数组中-使用以下代码获取包含视图中显示的所有UITextField的文本值的数组:
NSMutableArray *addressArray=[[NSMutableArray alloc] init];
for(id aSubView in [self.view subviews])
{
if([aSubView isKindOfClass:[UITextField class]])
{
UITextField *textField=(UITextField*)aSubView;
[addressArray addObject:textField.text];
}
}
NSLog(@"%@", addressArray);
我发现自己经常在上这样键入:
NSMutableArray]alloc]init]autorelease
XCode让我很扫兴,所以:p这不会捕获嵌入在其他视图中的UITextFields。递归,但使用全局变量?邪恶!这将无法捕获嵌入其他视图中的UITextFields。请在创建它们时将它们添加到数组???请注意,委托不包含对textfields的引用,相反,无法单独从委托中查找字段。这不是如果([x respondsToSelector:@selector(subviews)]{
作为-子视图
返回@属性(非原子、只读、复制)NSArray*子视图
。因此该数组中的任何项都将是UIView
类型或响应@选择器(子视图)的子类或UIView
我只是对向我甚至不知道类的对象发送消息感到非常不安-如果某个bonehead子类化了UIView
,子视图包含非UIView
继承的对象,因此对象不响应@选择器(子视图),会怎么样
?覆盖该方法并添加非UIView
,实际上没有意义-如果用户这样做,他们很可能会足够聪明,知道他们为什么要这样做以及可能涉及的任何风险。至少人们希望如此;)@jostster此解决方案不需要硬编码数组。添加的任何UITextField通过addSubview
或Interface Builder自动将子视图
数组添加到视图中。@Tim我使用您的代码进行了一些修改。基本上,我将findAllTextFieldsInView放在我的TextFieldDelegate类中,并在加载时在视图中调用它。我需要在TextFieldDelegate中设置一个从视图到控制器,因此,当代理调用findAllTextFieldsInView时,它将解析控制器。我如何才能做到这一点?我的控制器可以是UIViewController或UITableViewController。将它们硬编码到数组中是毫无意义的…无法实现我想要获取所有文本字段的数组的目的,因为我可以手动创建它…没有hardcoding如果在创建时将UITextField
添加到NSMutableArray
中,我将根据来自API的数据创建文本字段,因此我不知道其中有哪些文本字段。我可以在创建时以编程方式添加这些字段,但我更希望只获取一个已存在的字段列表不要依赖开发人员将每个字段添加到数组中。为什么要添加这些字段,然后在第二步中找到它们?这听起来效率很低。如果您想在创建UITextField
时将其添加到数组中(并且已经有了引用)。
NSMutableArray *textFields = [[NSMutableArray alloc] init];
UITextField *textField = [[UITextField alloc] initWithFrame:myFrame];
[textFields addObject:textField]; // <- repeat for each UITextField
@property (nonatomic, retain) IBOutletCollection(UITextField) NSArray *textFields;
NSMutableArray *addressArray=[[NSMutableArray alloc] init];
for(id aSubView in [self.view subviews])
{
if([aSubView isKindOfClass:[UITextField class]])
{
UITextField *textField=(UITextField*)aSubView;
[addressArray addObject:textField.text];
}
}
NSLog(@"%@", addressArray);
extension UIView
{
class func getAllSubviewsOfType<T: UIView>(view: UIView) -> [T]
{
return view.subviews.flatMap { subView -> [T] in
var result = UIView.getAllSubviewsOfType(view: subView) as [T]
if let view = subView as? T {
result.append(view)
}
return result
}
}
func getAllSubviewsWithType<T: UIView>() -> [T] {
return UIView.getAllSubviewsOfType(view: self.view) as [T]
}
}
let textFields = self.view.getAllSubviewsWithType() as [UITextField]