如何在UIToolbar中的UIBarButtonItem动作中发送发件人

3

看起来这是一个简单的任务。在工具栏(键盘顶部)内的按钮应该发送发送者到一个函数。使用下面的代码,我在调试器中收到“向实例发送未识别的选择器”的错误信息。

我的目标是访问自定义单元格的特定TextField。这段代码对于识别例如开关非常有效。

工具栏的声明:

UIToolbar* itemToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
itemToolbar.barStyle = UIBarStyleBlackTranslucent;
itemToolbar.items = [NSArray arrayWithObjects:
                     [[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelNumberPad)],
                     [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
                     [[UIBarButtonItem alloc]initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithNumberPad)],
                     nil];
[itemToolbar sizeToFit];

doneWithNumberPad的功能:

- (void)doneWithNumberPad:(id)sender {
    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
    NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSLog(@"%@", [object valueForKey:@"item"]);
}

感谢您的任何帮助。
1个回答

5
您只需要在保存按钮的选择器方法中包含冒号即可。
itemToolbar.items = [NSArray arrayWithObjects:
                     [[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelNumberPad)],
                     [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
                     [[UIBarButtonItem alloc]initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithNumberPad:)],
                     nil];

sender 的类型为 NSObject,在转换坐标之前将其转换为 UIBarButtonItem

- (void)doneWithNumberPad:(id)sender {
    UIBarButtonItem *button = (UIBarButtonItem *)sender;
    CGPoint buttonPosition = [button convertPoint:CGPointZero toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
    NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSLog(@"%@", [object valueForKey:@"item"]);
}

没错,谢谢你...现在可以了。但是现在CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView]; 出现了错误"unrecognized selector sent to instance"。必须调查一下。 - Peter
请将发送者强制转换为UIBarButtonItem。 - Anupdas
@Peter 我已经包含了代码。在按钮的事件处理程序方法中,您可以看到将sender分配给button。您还可以通过将方法从- (void)doneWithNumberPad:(id)sender更改为- (void)doneWithNumberPad:(UIBarButtonItem *)button来执行相同操作。现在不需要进行类型转换。有关Objective-C中类型转换的更多阅读,请参见casting in Objective-C - Anupdas
1
但是我收到了以下错误:UIBarButtonItem没有可见的@interface声称选择器'convertPoint:toView:'。在这两种方式下都一样。无论是更改void函数还是转换发送方(<-对吗?)抱歉打扰你了。 - Peter
忘记我之前的帖子吧。我在这里走错了路。但是我学到了一些关于类型转换的知识!谢谢! - Peter
@Peter,convertPoint:toView: 只在 UIView 的子类中可用。如果您使用视图创建 UIBarButtonItem,则可以完成此操作。 - Anupdas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接