如何在自定义单元格中点击以编程方式添加的 UiImageViews 推送新视图
Posted
技术标签:
【中文标题】如何在自定义单元格中点击以编程方式添加的 UiImageViews 推送新视图【英文标题】:How to push a new view tapping programmatically added UiImageViews in a custom cell 【发布时间】:2013-02-07 15:08:28 【问题描述】:我想这样当我点击 UITableViewCell 中的图像时,它会推送一个新视图并显示一个您可以操作的 UIImageView(例如捏合和展开它)。
目前,我正在使用一个自定义单元格,它以编程方式将图像添加到单元格中:
for (int i = 0; i < [self.news.imgURL count]; i++)
UIImageView *image = [[UIImageView alloc] init];
[image setImageWithURL:[NSURL URLWithString:[self.news.imgURL objectAtIndex:i]]];
[image setFrame:CGRectMake(20, (labelSize.height + 25 + 14) + (i * 280), 280, 280)];
image.contentMode = UIViewContentModeScaleAspectFit;
image.tag = 101 + i;
image.userInteractionEnabled = YES;
[self.contentView addSubview:image];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[tap setNumberOfTapsRequired:1]
[image addGestureRecognizer: tap];
这位于我的 customcell.m 文件中。
如上面的代码所示,我使用了一个 GestureRecognizer,我可以使用以下代码检测图像的点击:
-(void) handleTap:(UITapGestureRecognizer *)recognizer
if (recognizer.state == UIGestureRecognizerStateEnded)
NSLog(@"Image tapped!", nil);
但我不知道如何从 customcell.m 文件中推送新视图。有没有办法从 customcell.m 文件中推送新视图,或者我必须从我的 masterviewcontroller 显式执行它?
【问题讨论】:
可能重复:***.com/questions/14719704/… 【参考方案1】:这是使用委托的一个很好的用例。为您的自定义单元类定义一个委托协议。然后让您的表格视图控制器将自己设置为单元格的代表。你的协议应该有一个方法告诉代理一个图像被点击了。单元格和图像可以是委托方法的参数。
在您的单元格的handleTap:
方法中,您可以检查委托是否响应协议方法,如果有,它会调用委托上的协议,传递自身(单元格)和点击的图像。
【讨论】:
由于我启用了与图像子视图的用户交互,因此我的控制器中从未调用 didSelectRowAtIndexPath (图像上的点击事件取代了单元格的事件。所以即使我的表格视图控制器是单元格的代表,我也可以'当图像在控制器中被点击时不做任何事情。【参考方案2】:在单元格敲击方法中编写以下代码或在didSelectRowAtIndexPath
yourViewCon *vc = [[yourViewCon alloc] init];
[self presentModalViewController:vc animated:YES];
【讨论】:
我在 didSelectRowAtIndexPath 中添加了代码,但我没有注意到它。【参考方案3】:首先你在MyCustomCell.h
中设置一个委托
@protocol MyCustomCellDelegate;
@interface MyCustomCell : UITableViewCell
@property (nonatomic, weak) id <MyCustomCellDelegate> delegate;
- (void)someCustomMethod:(NSString*)stringForChangingSomethingInMyCell;
@end
@protocol MyCustomDelegate <NSObject>
@required
- (void)itemTappedForRow:(NSUIInteger)rowNumber;
@end
在MyCustomCell.m
中,您合成了委托:
@synthesize delegate = _delegate;
在你的handleTapMethod
:
// You can use self.tag to track rowNumbers
[_delegate itemTappedForRow:rowNumber];
同时在您的表格视图控制器中,您符合您刚刚定义的协议
@interface MyTableViewController : UITableViewController<MyCustomCellDelegate>
然后您以这种方式在 cellForRowAtIndexPath
中创建单元格:
UITableViewCell *cell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"yoBaby"];
cell.delegate = self;
cell.tag = indexPath.row;
return cell;
最后,在itemTappedForRow
中,你推送了一个新的视图控制器来为你做这些事情。我假设您使用的是导航控制器。
[self.navigationController pushViewController:yourNewViewControllerWithTheImageSelected animated:YES];
【讨论】:
假设每个人都在使用新版本的 Xcode(4.4 或更高版本)和/或更新的编译器,则不需要@synthesize
行。并且对_delegate
的引用实际上应该是self.delegate
,除非有充分的理由直接引用ivar。此外,协议方法应该是可选的,而不是必需的。如果定义协议的类可以在没有委托实现方法的情况下正常工作,那么该方法应该是可选的。
itemTappedForRow 应该怎么做?它如何连接到 didSelectRowAtIndexPath?
抱歉,这是个小失误。我改变了答案。您不必再在didSelectRowAtIndexPath
中写任何东西了。以上是关于如何在自定义单元格中点击以编程方式添加的 UiImageViews 推送新视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在自定义滑动(而不是滑动删除)单元格(滑动到邮件/短信)中点击一个单元格时删除在其他 TableView 单元格中添加的子视图