0

有没有办法获得对我的超级视图的视图控制器的引用?在过去的几个月里,有好几次我需要这个,但不知道该怎么做。我的意思是,如果我在自定义单元格上有一个自定义按钮,并且我希望获得控制我当前所在单元格的表格视图控制器的引用,是否有代码片段?还是我应该通过使用更好的设计模式来解决它?

谢谢!

4

3 回答 3

3

你的按钮最好不知道它的 superviews 视图控制器。

但是,如果您的按钮确实需要向它不应该知道详细信息的对象发送消息,您可以使用委托将您想要的消息发送给按钮委托。

创建一个 MyButtonDelegate 协议并定义符合该协议的每个人都需要实现的方法(回调)。你也可以有可选的方法。

然后在按钮上添加一个属性,@property (weak) id<MyButtonDelegate>以便任何类型的任何类都可以设置为委托,只要它符合您的协议。

现在视图控制器可以实现 MyButtonDelegate 协议并将自己设置为委托。需要有关视图控制器知识的代码部分应在委托方法(或方法)中实现。

视图现在可以将协议消息发送给它的委托(不知道它是谁或什么),并且委托可以发送到该按钮的适当事物。这样可以重复使用相同的按钮,因为它不依赖于它的使用位置。

于 2012-05-12T09:38:26.763 回答
0

当我问这个问题时,我在想,在我有带有按钮的自定义单元格的情况下,TableViewController 如何知道点击了哪个单元格的按钮。最近,阅读《iOS 食谱》一书,我得到了解决方案:

-(IBAction)cellButtonTapped:(id)sender
{
NSLog(@"%s", __FUNCTION__);
UIButton *button = sender;

//Convert the tapped point to the tableView coordinate system
CGPoint correctedPoint = [button convertPoint:button.bounds.origin toView:self.tableView];

//Get the cell at that point
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:correctedPoint];

NSLog(@"Button tapped in row %d", indexPath.row);
}

另一个更脆弱(虽然更简单)的解决方案是:

- (IBAction)cellButtonTapped:(id)sender 
{
    // Go get the enclosing cell manually
    UITableViewCell *parentCell = [[sender superview] superview];
    NSIndexPath *pathForButton = [self.tableView indexPathForCell:parentCell];
}

最可重用的方法是将此方法添加到 UITableView 的类别中

- (NSIndexPath *)prp_indexPathForRowContainingView:(UIView *)view 
{
   CGPoint correctedPoint = [view convertPoint:view.bounds.origin toView:self]; 
   return [self indexPathForRowAtPoint:correctedPoint];
}

然后,在你的 UITableViewController 类上,使用这个:

- (IBAction)cellButtonTapped:(id)sender 
{
    NSIndexPath *pathForButton = [self.tableView indexPathForRowContainingView:sender];
}
于 2012-08-02T00:19:36.477 回答
-1

如果您知道哪个类是您的视图控制器的父视图,您只需遍历子视图数组并为您的父类进行类型检查。

例如。

UIView *view; 

for(tempView in self.subviews) {

   if([tempView isKindOfClass:[SuperViewController class] ])

        {
           // you got the reference, do waht you want

         }


   }
于 2012-05-12T13:41:55.673 回答