【问题标题】:Button sender.superview is showing as UIViewController instead of my CustomCell?按钮 sender.superview 显示为 UIViewController 而不是我的 CustomCell?
【发布时间】:2012-10-22 08:43:54
【问题描述】:

我在单元格中有按钮,它有一个到自定义单元格的出口,并且在我的第一个视图控制器中有一个 IBAction:

-(IBAction)AddButton:(UIButton *)sender{

ProductCell *cell = (ProductCell *)sender.superview;
UITableView *tableView - (UITableView *)cell.superview;
NSIndexPath *indexPath = [tableView indexPathForCell:cell];

NSLog(@"Sender: %@, Super: %@", sender, sender.superview);

//[saveitemArray addObject: [itemArray objectAtIndex:(indexPath.row + 1)]];  
//[saveitemArray writeToFile:[self saveListPath] atomically:YES];
}

单步执行代码显示发送方为 UIButton,但变量“单元格”为 FirstViewController。似乎只是完全跳过了单元格和表格。我错过了什么简单的事情?

更新:

好的,所以我已经向您展示了完整的 IBAction,在注释掉最后两行之后,我的单元格变量显示为 CustomCell(正确的超级视图),但现在我的 tableView 变量显示的是 FirstViewController 超级视图而不是 CustomTable?您的 NSLog 显示相同,因此我将其更改为显示 cell 和 cell.superview。结果如下:

Sender: <UITableViewCellContentView: 0x716fb20; frame = (0 0; 320 43);     
gestureRecognizers = <NSArray: 0x71711d0>; layer = <CALayer: 0x716fbd0>>, Super:   
<ProductCell: 0x716f820; baseClass = UITableViewCell; frame = (0 0; 320 44); autoresize 
= W; layer = <CALayer: 0x716f990>>

第二次更新:

似乎认为 sender.superview 是 CellContentView 而不是 Cell 本身,因此当我尝试获取 indexPath 时,它尝试将单元格用作表格并将 CellContentView 用作单元格。我认为没有必要通过 ContentView,我认为按钮中的 .superview 会直接进入单元格本身?

已回答:

似乎您必须按此顺序遍历层次结构。

Button -> CellContentView -> Cell -> TableView

【问题讨论】:

  • 请显示一些NSLogsuperview 永远不应指向 UIViewController 子类。
  • 你能试试NSLog(@"Sender: %@, Super: %@", sender, sender.superview);吗?我认为/希望调试器在骗你。 :)
  • @PhillipMills 好的,所以我更新了显示的 IBAction 并最终改为使用 NSlogging 单元格变量。
  • 当你说意外的东西显示为 FirstViewController 时,我认为调试器的问题相同。当您看到尝试 NSLog 或“po”命令并与变量显示向您显示的内容进行比较时。

标签: ios cocoa-touch uitableview


【解决方案1】:

我认为在 interface-builder 中连接 IBOutlets 时出了点问题。

在操作中设置断点并尝试在调试器中递归地记录整个视图以检查它:

po [[self view] recursiveDescription];

更新

您似乎根据更新将操作添加到单元格而不是按钮..

更新 2:

- (IBAction) AddButton:(UIButton *)sender{

    UIView *cellContentView = (UIView *)sender.superview;
    ProductCell *cell = (ProductCell *)cellContentView.superview;
    UITableView *tableView - (UITableView *)cell.superview;
    NSIndexPath *indexPath = [tableView indexPathForCell:cell];

}

或者你可以在这个方法中给按钮一个标签:

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

    //your setup code here..

    cell.yourButton.tag = indexPath.row;

}

.. 如果您只有 1 个部分,请在此处访问索引路径:

- (IBAction) AddButton:(UIButton *)sender{
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:sender.tag inSection:0];
}

应该这样做!

【讨论】:

  • 到目前为止一切正常。 TableView -> CustomCell -> CellContent 视图 -> 按钮 + 标签。我应该特别寻找什么吗?
  • 不,我刚刚确认按钮已连接到 IBAction。 (内部修饰)
  • 您好,是的,我正在阅读您的聊天记录,但我还不能在那里交谈,我的声望不超过 20。 : ( 我已经再次更新了描述。
  • 好的,是的,我认为您的第二次更新是正确的。我会为其他读者更新答案。
  • 那么我该如何获取 CellContentView,它的标识符是什么?
猜你喜欢
  • 2015-10-09
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 2020-12-23
  • 2019-12-19
相关资源
最近更新 更多