我有一个UITableView,我用来显示数据,要求我拥有比iPhone screenWidth宽得多的单元格。
因此我创建了一个包含子类UIScrollView的子类UITableViewCell。这就是我的代码。
TableView.h
@property (strong, nonatomic) CustomCell *cell;
TableView.m
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
cellDictionary = [xmlMArray objectAtIndex:indexPath.row];
static NSString *CellIdentifier = @"Cell";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Configure the cell.
cell.selectionStyle = UITableViewCellSelectionStyleGray;
cell.itemsDictionary = cellDictionary;
cell.currentIndex = indexPath;
cellDictionary = nil;
[cell drawCell];
return cell;
}
在上面的方法中,您可以看到我正在调用我创建的自定义UITableViewCell。
CustomCell.h
@property (strong, nonatomic) NSDictionary *itemsDictionary;
@property (strong, nonatomic) MyScrollView *scrollCell;
@property (strong, nonatomic) NSIndexPath *currentIndex;
- (void)drawCell;
CustomCell.m
- (void)drawCell
{
scrollCell = [[MyScrollView alloc] init];
scrollCell.itemsDictionary = itemsDictionary;
[scrollCell drawCell];
scrollCell.backgroundColor = [UIColor whiteColor];
scrollCell.frame = CGRectMake(0.0, 0.0, ScreenWidth, 45.0);
[[self contentView] addSubview:scrollCell];
}
在上面的drawCell方法中,我调用了一个自定义scrollView
MyScrollView.m
- (void)drawCell
{
bgGray = NO;
fNameString = [[UILabel alloc] init];
fNameString.backgroundColor = [UIColor clearColor];
fNameString.frame = CGRectMake(15.0, 0.5, 70.0, 40.0);
fNameString.text = [itemsDictionary objectForKey:@"fName"];
lNameString = [[UILabel alloc] init];
lNameString.backgroundColor = [UIColor clearColor];
lNameString.frame = CGRectMake(105.0, 0.5, 95.0, 40.0);
lNameString.text = [itemsDictionary objectForKey:@"lName"];
addressString = [[UILabel alloc] init];
addressString.backgroundColor = [UIColor clearColor];
addressString.frame = CGRectMake(220.0, 10.5, addressString.frame.size.width, 50.0);
addressString.text = [NSString stringWithFormat:@"Address: %@: %@",[itemsDictionary objectForKey:@"aNumber"] ,[itemsDictionary objectForKey:@"aString"]];
[addressString sizeToFit];
[self setContentSize:(CGSizeMake((220.0 + addressString.frame.size.width)+15, 45.0))];
[self addSubview:fNameString];
[self addSubview:lNameString];
[self addSubview:addressString];
}
上面的方法绘制滚动视图然后传递到CustomCell,一切正常并正确显示,下面是我用于检测cusome滚动视图上的触摸的方法,它与上面的方法在同一个类中看起来像这样。
- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
{
NSLog(@"touch scroll");
// If not dragging, send event to next responder
if (!self.dragging) {
// touch detected...
//How can I now call didSelectRow from TableView?
} else {
[super touchesEnded: touches withEvent: event];
}
}
所以我的问题是,如何使用 touchEnded 方法调用原始TableView类中的 didSelectRowFromIndexPath 方法?或者,有没有比我目前做的更好的方法呢?
注意:我必须使用这些子类的原因是因为UIScrollView覆盖了UITableViewCell选择函数,所以我不得不将scrollview子类化为拦截触摸事件现在我希望我可以调用原始tableview选择方法,在你的帮助下。
答案 0 :(得分:5)
如何使用以下代码调用委托函数:
[yourTableView.delegate tableView:tableView didSelectRowAtIndexPath:aIndexPath];
在子类化单元存储中,对tableview和indexPath的弱引用。
另一个解决方案是循环查看单元格的超级视图,直到找到tableview。尽管如此,苹果可能有一天会改变视图层次结构的方式,这会破坏代码,因为它们通过在某些视图周围包裹另一层来实现从iOS6到iOS7 ......