1

我有一个有趣的场景。我有一个包含按钮的自定义 TableViewCell 类。我想做的是在自定义单元格类中捕获按钮的触摸事件,并为容器控件(ler)处理一个新事件。

原因是我有一个带有标记为“存档”按钮的单元格。现在,我不想处理自定义 TableViewController 中的单元格代码,而是首先拦截按钮调用,因为我需要隐藏存档按钮并告诉容器控件(或 TableViewController)处理“单元格 X 上发生了存档事件”。我不希望控制器知道细胞内发生了什么。这样我就有了一些可重用和更简洁的代码。

因此控制器应该能够接收事件并形成事件以确定涉及哪个单元,以便知道它需要删除哪个记录。我可以通过 NSNotificationCenter 类实现这一点,并让观察者为我处理它,但如果我可以将它作为一个事件提出来,那就太好了(我想,不知道你是否同意)。

这可以通过iOS开发完成吗?

我希望我的问题是有道理的。

谢谢

编辑:看来我被误解了。所以让我说清楚(除非这根本不可能),我不希望 TableViewController 知道单元格内的按钮。控制器需要接收单元生成的事件,因为它捕获了原始按钮触摸事件,并且从单元内部需要生成控制器可以捕获的新事件。类似于您在 .NET 世界中可以做的事情。但是,如果无法做到这一点,请告诉我。原因是为了更清洁和可重用的代码。

4

3 回答 3

1

创建自定义表格视图单元格时,可以将回调附加到按钮按下事件。现在您可以将索引作为按钮的标记传递,从您的 uitableview 控制器中的数据源中删除项目。

重新加载表格视图,您就可以开始了。

希望这对您有所帮助。

myCell.archiveButton.tag = indexPath.row ; // This is the index in your data source

[myCell.archiveButton addTarget:self action:@selector(archiveItems:) forControlEvents: UIControlEventTouchUpInside];

void archiveItems:(id)sender {
    int index = sender.tag;
// Remove the item from your data source

[self.myTableview reloadData];

}
于 2012-07-03T12:34:02.717 回答
0

是的,你可以做到。

首先,您必须将位置设置为该按钮的标签。然后您将为您的 ViewController 设置 Button 的目标,并像这样调用选择器方法。

[yourCustomCell.yourButton setTag:indexPath.row];//set position as tag to remember the position
[yourCustomCell.yourButton addTarget:self action:@selector(doArchive:) forControlEvents:UIControlEventTouchUpInside];

然后在你的doArchive方法中,获取标签,它实际上是这样的位置:

- (void)doArchive:(id)sender
{    
    int positon = sender.tag;
    // do something with positon and get the data from your Array at that position
}
于 2012-07-03T12:36:42.597 回答
0

除非有人能告诉我更好的方法,否则我会采用这种方法。

假设你有一个 TableViewController:

@interface CustomViewController : UITableViewController<ArchiveItemDelegate> ...

你有一个自定义 TableViewCell:

@interface CustomCell : UITableViewCell ...

使用下面的委托协议的委托属性。

现在我创建了一个协议:

@protocol ArchiveItemDelegate <NSObject>

-(void)archiveActionPerformed:(CustomCellData *)cellData onCell:(CustomCell *)cell;

@end

在我的 CustomCell 实现中,我在存档按钮上附加了一个事件侦听器:

- (void)archiveButtonPressed:(UIButton *) sender forEvent:(UIEvent *)event {
    [self.delegate archiveActionPerformed:currentCellData onCell:self];
}

现在在我的 TableViewController 中,我让它从 ArchiveItemDelegate 协议“继承”并实现它。

-(void)archiveActionPerformed:(CustomCellData *)cellData onCell:(CustomCell *)cell {
    // do whatever ...
}

现在在我的“tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath”方法中,我只是将 TableViewController 附加到单元格。

cell.delegate = self;

现在我的 TableViewController 不知道 Cell 的内部结构,并且当点击 Archive 按钮时,cell 会通知“归档事件”。这可能会“进化”一点,但现在我认为可以。如果有人有更好的解决方案,请告诉我。您可以看到我来自 .NET 空间;-)

于 2012-07-04T07:09:19.337 回答