在自定义 UITableCell 中从 UITextField 调用 textFieldShouldReturn 时遇到问题
Posted
技术标签:
【中文标题】在自定义 UITableCell 中从 UITextField 调用 textFieldShouldReturn 时遇到问题【英文标题】:Having trouble calling textFieldShouldReturn from a UITextField within a custom UITableCell 【发布时间】:2014-09-13 05:13:44 【问题描述】:我正在尝试在我的表格视图上的自定义 UITableCell 中的 UITextField 上调用 textFieldShouldReturn。我使用这段代码来抓取单元格的索引路径,我在另一篇文章的***上找到了这个方法:
NSIndexPath *indexPath = [self.tableView indexPathForCell:(friendTableCell*)[[textField superview] superview]];
当我编译和运行时,我没有任何错误,但是当我选择一个单元格,输入文本并尝试在键盘上按回车键时,没有任何反应。我已经排除了应该调用的其余代码,因为它相当冗长,并且我已经在 didSelectRowAtIndexPath 中进行了测试并且它可以工作。如果有人真的想看看,我可以包括它。我认为也许我的代表没有为键盘正确设置,但是我在标题中包含了 UITextFieldDelegate,而且我不确定如何为键盘设置代表,因为我正在访问其中的自定义单元格一个表视图。如果有人知道该怎么做或替代方法,我将不胜感激。谢谢!
更新 - 完成 textFieldShouldReturn 方法
- (BOOL)textFieldShouldReturn:(UITextField *)textField
NSIndexPath *indexPath = [self.tableView indexPathForCell:(friendTableCell*)[[[textField superview] superview] superview]];
NSString *sectionTitle = [self.usernameSectionTitles objectAtIndex:indexPath.section];
NSArray *sectionUser = [self.sortedUsernames objectForKey:sectionTitle];
self.recipient = [sectionUser objectAtIndex:indexPath.row];
friendTableCell *cell = (friendTableCell *)[self.tableView cellForRowAtIndexPath:indexPath];
NSString *sendingUser = self.currentUser.username;
NSString *message = [NSString stringWithFormat:@"from %@", [sendingUser uppercaseString]];
if ([self.locationSwitch isOn])
if ([cell.message.text length] > 0)
message = [NSString stringWithFormat:@"from %@ %@", [sendingUser uppercaseString],cell.message.text];
CLLocation *location = locationManager.location;
if(!location)
[cell closeMessage:self];
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^
CLLocationCoordinate2D coordinate = [location coordinate];
PFGeoPoint *geoPoint = [PFGeoPoint geoPointWithLatitude:coordinate.latitude longitude:coordinate.longitude];
PFObject *object = [PFObject objectWithClassName:@"Location"];
[object setObject:geoPoint forKey:@"location"];
[object setObject:self.recipient.objectId forKey:@"recipient"];
[object saveEventually:^(BOOL succeeded, NSError *error)
if(succeeded)
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Your Location was sent!"message:[error.userInfo objectForKey:@"error"] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
dispatch_sync(queue, ^
PFQuery *locationQuery = [PFQuery queryWithClassName:@"Location"];
[locationQuery whereKey:@"recipient" equalTo:self.recipient.objectId];
/****** CHANGE THE getFirstObjectInBackground method so it doesn't take the first each time
or DELETE THE LOCATION after it has been viewed **************/
[locationQuery getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error)
if (error)
NSLog(@"Error: %@ %@", error, [error userInfo]);
else
self.locationId = object.objectId;
NSLog(@"Here is you location ID: %@", self.locationId);
dispatch_sync(queue, ^
self.data = @
@"alert":message,
@"locationId":self.locationId
;
PFQuery *userQuery = [PFUser query];
[userQuery whereKey:@"objectId" equalTo:self.recipient.objectId];
PFQuery *query = [PFInstallation query];
[query whereKey:@"currentUser" matchesQuery:userQuery];
PFPush *push= [[PFPush alloc]init];
[push setQuery:query];
[push setData:self.data];
[push sendPushInBackground];
);
];
);
];
);
else if ([cell.message.text length] > 0)
message = [NSString stringWithFormat:@"from %@ %@", [sendingUser uppercaseString],cell.message.text];
PFQuery *userQuery = [PFUser query];
[userQuery whereKey:@"objectId" equalTo:self.recipient.objectId];
PFQuery *query = [PFInstallation query];
[query whereKey:@"currentUser" matchesQuery:userQuery];
PFPush *push= [[PFPush alloc]init];
[push setQuery:query];
[push setMessage:message];
[push sendPushInBackground];
else
PFQuery *userQuery = [PFUser query];
[userQuery whereKey:@"objectId" equalTo:self.recipient.objectId];
PFQuery *query = [PFInstallation query];
[query whereKey:@"currentUser" matchesQuery:userQuery];
PFPush *push= [[PFPush alloc]init];
[push setQuery:query];
[push setMessage:message];
[push sendPushInBackground];
NSLog(@"Message sent!");
[cell closeMessage:self];
[cell resignFirstResponder];
return YES;
【问题讨论】:
在添加到自定义表格单元格时,您是否为您的文本字段绑定了委托?textField.delegate = self
?
是的,文本字段在自定义 uitablecell nib 文件中设置了它的委托。
你想从哪里访问 textFieldShouldReturn ,从 CustomCell 还是从带有 tableView 的类?
来自带有 tableView 的类
我认为您必须在 CellForRowAtIndexPath 中包含“cell.textField.delegate = self”
【参考方案1】:
试试这个NSIndexPath *indexPath = [self.tableView indexPathForCell:(friendTableCell*)[[[textField superview] superview] superview]];
,因为容器视图和单元格之间还有另一个滚动视图层。
我也可以看到你写了[cell resignFirstResponder];
,而不是你应该使用[textField resignResponder]
希望这会奏效..
【讨论】:
好的...它最初可以工作,但后来停止了。我不太确定那是什么意思。你有什么想法吗? 我不确定你在说什么,它工作了然后停止了,这怎么可能,如果它工作那么它将永远工作.. 清理并重新构建。此外,如果它有效,请不要忘记接受答案:) 还发布您的详细代码。 这就是我如此困惑的原因。我最初将它加载到我的手机上,它运行良好。然后我开始编写另一段完全不相关的代码,当我再次运行构建并尝试使用我的应用程序时,“发送”按钮不再起作用。我已经更新了上面的代码以包含我的整个 textFieldShouldReturn 方法。感谢您的帮助! 你到底是什么问题,- (BOOL)textFieldShouldReturn:(UITextField *)textField 在键盘上敲回车键后没有调用,对吧? 是的,没错。当我点击键盘上的返回键时它没有调用以上是关于在自定义 UITableCell 中从 UITextField 调用 textFieldShouldReturn 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章
在自定义 UIView 类中从 UIView 快速创建 IBoutlet [重复]
如何在自定义 UIView 中从 ViewController 传递数据
如何在自定义 Zapier 应用程序中从 Xero 访问特定订单项值?
需要在自定义 UITextField 中调用 shouldChangeCharactersInRange 并调用视图控制器函数通知更新