在实际开发中我遇到一种情况:我在自定义了一个tableViewCell,里面包含有多个textField用于给用户输入信息。但是每次点击这些textField的时候,系统都会弹出一个键盘,在不同size的iphone上不同程度地遮挡住了我的textField。关于如何解决这个问题,我在上一篇博文的时候已经提到,但是这里详细记录一下,但点击键盘return键的时候,是怎样可以获取到相应的tableView,然后对其进行动态移动的。
步骤:
1.要想监听键盘的return事件并对其进行响应,就必须设置好代理和在响应的类里面使用对应的协议,这里我在自定义的tableViewCell类中使用了UITextFieldDelegate协议。
@interface PMGCostTableSubviewCell : UITableViewCell <UITextFieldDelegate>
至于设置代理,只需要在Interface Builder中设置好各个textField的delegate指向fileOwner,也就是自定义的tableViewCell类就OK了。
2.监听到键盘的return事件后,响应的方法,这个方法在UITextFieldDelegate的协议中,使用了这个协议就能使用这个方法,代码如下:
[textField resignFirstResponder]; //取消textField的第一响应,也就是退回键盘
UIView *parentView = textField.superview.superview.superview.superview; //获取到tableView
// NSLog(@"%@",textField.superview);
// NSLog(@"%@",textField.superview.superview);
// NSLog(@"%@",textField.superview.superview.superview);
// NSLog(@"%@",textField.superview.superview.superview.superview);
//以下就是view的移动
CGRect frame = parentView.frame;
if (frame.origin.y == 0) {
return NO;
}
if ([UIScreen mainScreen].bounds.size.height != 480) {
frame.origin.y += 130;
}
else
{
frame.origin.y += frame.size.height*0.425;
}
[UIView beginAnimations:@"moveView" context:nil];
[UIView setAnimationDuration:0.3];
parentView.frame = frame;
[UIView commitAnimations];
return YES;
以上就是点击了return按钮,让tableView回到原来位置的方法,但是其中的难点就是,我们要如何通过自定义的tableViewCell中的一个textField来获取到包含了这个tableViewCell的tableView呢?
注释掉的那几行代码,就可以帮我们了解到,这个View之间是怎么包含的,取消注释,可以看到输入的对象依次是:
UITableViewCellContentView
SeanCostTableSubviewCell
UITableViewWrapperView
UITableView