如何从自定义 tableviewcell 中的按钮显示弹出视图?

Posted

技术标签:

【中文标题】如何从自定义 tableviewcell 中的按钮显示弹出视图?【英文标题】:How to show popover view from button in custom tableviewcell? 【发布时间】:2013-06-25 14:50:29 【问题描述】:

我正在开发一个应用程序,用户可以在其中输入产品和有关这些产品的信息。产品的所有信息都输入到自定义 UITableViewCell 中。我还希望允许用户添加产品图像。为此,我需要显示一个包含 UIImagePickerController 的弹出视图。当我这样做时,Xcode 给了我这个错误:

无法从没有窗口的视图中呈现弹出框。

当用户点击按钮添加(称为addImage)图像时,我的自定义单元格会在我的 TableView 中触发此操作:

- (void) addImage

    CustomCell *customcell = [[CustomCell alloc] init];

    itemImagePicker = [[UIImagePickerController alloc] init];
    itemImagePicker.delegate = self;
    itemImagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary;

    itemImagePopover = [[UIPopoverController alloc] initWithContentViewController:itemImagePicker];
    [itemImagePopover presentPopoverFromRect:customCell.addImage.bounds inView:self.tableView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];


我的 cellForRowAtIndexPath 看起来像:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CustomCellIdentifier = @"CustomCellIdentifier ";
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];
    if (cell == nil) 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell"
                                                     owner:self options:nil];
        for (id oneObject in nib) if ([oneObject isKindOfClass:[CustomCell class]])
            cell = (CustomCell *)oneObject;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
    NSUInteger *row = [indexPath row];
    Model *model = self.products[indexPath.row];

    cell.itemName.text = model.itemName;
    cell.itemDescription.text = model.itemDescription;
    cell.itemPrice.text = model.itemPrice;

    cell.itemPrice.delegate = self;
    cell.itemName.delegate = self;
    cell.itemDescription.delegate = self;

    NSLog(@"%@", cell.itemPrice);

    return cell;

(“model”是一个自定义类。该类的每个实例代表一个产品。每次用户向 tableview 添加一行时,该类的一个实例被添加到数组中。)

我整天都在搜索 SO 和 google,但我还没有找到任何关于它如何与自定义单元格一起工作的解决方案,只有关于它在 didSelectRowAtIndexPath 中的工作方式以及触摸披露按钮时的工作方式。

所以我的观点很快:当点击自定义单元格内的按钮时,如何正确显示弹出视图?

提前感谢您,任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您正在该方法中创建 CustomCell 的新实例。此实例未显示在屏幕上的任何位置。您需要找到代表要从中显示弹出框的行的 CustomCell 实例。如果这一行是静态的并且总是相同的,你可以这样做:

// change the row and section variables below to the values that correspond to the section and row from which you want to display the popover
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section]; 
CustomCell *customCell = [self.tableView cellForRowAtIndexPath:indexPath];

如果您事先不知道索引路径,请将其作为参数传递给addImage:

编辑

从您更新的问题来看,您似乎混淆了 MVC 的不同部分。将按钮添加到您的自定义单元格很好,但出于可重用性目的,您不应该从那里处理点击。这是您的视图控制器应该做的事情。视图控制器如何知道按钮何时被点击? Delegation.

【讨论】:

? ?那两个到底是什么?我以前从未见过他们(我是初学者)。恐怕它不起作用,是给我那行代码的“预期表达式”错误/ 您需要填写与要从中显示弹出框的单元格对应的行和部分的值。为了清楚起见,我将进行编辑。 啊,澄清了。你能解释一下如何将 indexpath 作为参数传递给该方法吗? 将方法更改为- addImage:(NSIndexPath *)indexPath,调用时传递正确的索引路径。如果您仍然不确定该怎么做,请更新您的问题,说明您从哪里调用addImage 以及您的表格视图是什么样的。 我以前从未这样做过。我将使用 cellForRowAtIndexPath 更新我的问题。 addImage 由我的 CustomClass 调用。

以上是关于如何从自定义 tableviewcell 中的按钮显示弹出视图?的主要内容,如果未能解决你的问题,请参考以下文章

无法从自定义表格视图单元格按钮中删除行

列表视图中的页脚按钮,如何从自定义列表适配器中获取值

单击时如何将按钮值从自定义小部件传递到 tkinter 中的主应用程序

将数据从自定义表格单元中的 uicollectionview 传递到 viewcontroller

单击自定义 TableViewCell Swift 4 中的按钮时如何呈现单独的视图控制器?

编辑完成后如何从自定义uitableviewcell的文本字段向数组添加数据