iOS:调用方法的 UITableViewCell 中的 UITextField
Posted
技术标签:
【中文标题】iOS:调用方法的 UITableViewCell 中的 UITextField【英文标题】:iOS: UITextField in UITableViewCell that calls method 【发布时间】:2016-05-25 23:18:50 【问题描述】:我需要在UITableViewCell
中使用UITextField
。这是使用 Parse 开源,我希望它发回一个标题。所以当它调用cellForRowAtIndexPath
时,它需要做这样的事情。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
UITextField *TextField = (UITextField *) [cell viewWithTag:284];
[TextField setReturnKeyType:UIReturnKeyDone];
[TextField addTarget:self
action:@selector(TitleTextFieldFinished:indexPath:object:)
forControlEvents:UIControlEventEditingDidEndOnExit];
TextField.text = [object objectForKey:@"Toppingname"];
return cell;
那么它可能会这样调用:
- (void)TitleTextField:(UITextField *)TextField:(NSIndexPath *)indexPath:(PFObject *)object
[TextField resignFirstResponder];
PFQuery *item = [PFQuery queryWithClassName:@"className"];
[item getObjectInBackgroundWithId:self.menuid
block:^(PFObject *title, NSError *error)
NSString *newTitle = @"New title";
title[@"title"] = newTitle;
[title saveInBackground];
];
如果有人可以提供帮助,那就太好了!
【问题讨论】:
仅供参考 - 方法和变量名称以小写字母开头是标准做法。类名以大写字母开头。遵循这个标准会让你的代码更容易被其他人阅读。 另外,您应该避免使用匿名参数名称的 Objective-C 方法名称。您建议的文本字段处理程序名为TitleTextField::
。这种命名约定加上缺少空格使您的代码很难阅读。
【参考方案1】:
实现如下所示
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellId" forIndexPath:indexPath];
// Configure the cell...
UITextField *textField = (UITextField *) [cell viewWithTag:284];
[textField setReturnKeyType:UIReturnKeyDone];
[textField addTarget:self
action:@selector(titleTextField:inIndexPath:forObject:)
forControlEvents:UIControlEventEditingDidEndOnExit];
textField.text = @"Sandeep";
return cell;
- (void)titleTextField:(UITextField *)textField inIndexPath:(NSIndexPath *)indexPath forObject:(PFObject *)object
[textField resignFirstResponder];
但是您不会得到“indexPath”和“object”值,因为 sender(UITextField) 不知道它应该发送哪个 indexPath 和哪个对象。
【讨论】:
不,你不能这样做。addTarget:action:forControlEvents:
方法只接受带有 0、1 或 2 个参数的选择器,它们不能是任意类型。这可能会崩溃。【参考方案2】:
当您使用addTarget:action:forControlEvents:
方法时,该方法只允许对可能的参数进行非常有限且固定的选项。它必须要么不带参数,1 个参数(控件),要么带 2 个参数(控件和事件)。
您正试图传递两个完全不相关的参数。另外,由于您奇怪的方法命名约定,您的方法名称实际上与您在@selector
中输入的名称不匹配。
您必须根据文本字段确定操作方法中的indexPath
,并且您必须使用其他方式(例如实例变量)来访问PFObject
。
除非你使用 Parse 添加的东西(我不熟悉它),否则cellForRowAtIndexPath
的方法签名是不正确的。它通常没有PFObject
参数。
【讨论】:
以上是关于iOS:调用方法的 UITableViewCell 中的 UITextField的主要内容,如果未能解决你的问题,请参考以下文章
iOS:自定义UITableViewCell的实现需要调用super
在 iOS 中访问自定义 UITableViewCell 中的视图
Uitableviewcell调用uiviewcontroller函数不起作用swift ios