我有DiscountListTableViewController
展示为我的应用程序单独的屏幕。 但还有另一个屏幕( PlaceDetailsViewController
),我需要显示在底部相关折扣。
目前, PlaceDetailsViewController.view
拥有UIScrollView
作为容器和我加入DiscountListTableViewController.tableView
到这个UIScrollView.content
集装箱viewDidLoad
的PlaceDetailsViewController
。 这工作和表视图中正确显示,但无法接收小区点击。
我知道UITableView
继承自UIScrollView
,它以某种方式不建议(但不局限于)。 然而,从松散的耦合点,每一个组件时,应在它可能在其他地方可独立使用的方式设计的,它的DiscountListTableViewController
在我的情况。
PlaceDetailsViewController
组件只需要DiscountListTableViewController
原样,所以没有逻辑理由不能直接使用。 有什么建议?
答:不要这样做。
UITableview
从---->继承UIScrollView : UIView : UIResponder : NSObject
苹果说:
重要提示:你不应该嵌入的UIScrollView对象的UIWebView或UITableView的对象。 如果这样做,可能会导致意外的行为,因为这两个物体的触摸事件可以混合起来,并错误地处理。
不建议? 它那种感觉就像“不这样做”阅读这一信息。 不可预测性是从来不为应用程序的好行为后,
重要提示:你不应该嵌入的UIScrollView对象的UIWebView或UITableView的对象。 如果这样做,可能会导致意外的行为,因为这两个物体的触摸事件可以混合起来,并错误地处理。
将分享如何解决了。 难道UIScrollView的子类,并用作PlaceDetailsViewController容器视图:
@interface PlaceDetailsContainerUIScrollView : UIScrollView
@end
@implementation PlaceDetailsContainerUIScrollView
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *result = [super hitTest:point withEvent:event];
if ([result isKindOfClass:[UIView class]] && (result.tag == kDiscountListTableViewCellTag)
{
UITableView *tableView = (UITableView *) [[result.superview superview] superview];
return tableView;
}
return result;
}
@end
另外,不要忘记设置PlaceDetailsContainerUIScrollView.delaysContentTouches = YES和PlaceDetailsContainerUIScrollView.canCancelContentTouches = NO。
此外,需要DiscountListTableViewController方法小修复:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DiscountDetailsViewController *discountDetailsVC = [[DiscountDetailsViewController alloc] init];
//[self.navigationController pushViewController:discountDetailsVC animated:YES];
// self.navigationController is nill because it's not pushed on nav stack, so will grab the current one:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.navigationController pushViewController:discountDetailsVC animated:YES];
}
不应该这样做,因为UITableView的是的UIScrollView的子类,根据苹果的文档。 只需使用自动布局更容易,你计算每一个项目的大小和回采表滚动这样做。
苹果文档 :
你不应该在UIScrollView的对象嵌入的UIWebView或UITableView的对象。 如果这样做,可能会导致意外的行为,因为这两个物体的触摸事件可以混合起来,并错误地处理。