在自定义 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 传递数据

如何在自定义混合任务中从 Ecto 获取数据

如何在自定义 Zapier 应用程序中从 Xero 访问特定订单项值?

需要在自定义 UITextField 中调用 shouldChangeCharactersInRange 并调用视图控制器函数通知更新

聚焦自定义 UITableCell 时移除细边框