如何使用的UITableView内的UIScrollView和接收单元的点击?如何使用的UITabl

2019-05-11 20:39发布

我有DiscountListTableViewController展示为我的应用程序单独的屏幕。 但还有另一个屏幕( PlaceDetailsViewController ),我需要显示在底部相关折扣。

目前, PlaceDetailsViewController.view拥有UIScrollView作为容器和我加入DiscountListTableViewController.tableView到这个UIScrollView.content集装箱viewDidLoadPlaceDetailsViewController 。 这工作和表视图中正确显示,但无法接收小区点击。

我知道UITableView继承自UIScrollView ,它以某种方式不建议(但不局限于)。 然而,从松散的耦合点,每一个组件时,应在它可能在其他地方可独立使用的方式设计的,它的DiscountListTableViewController在我的情况。

PlaceDetailsViewController组件只需要DiscountListTableViewController原样,所以没有逻辑理由不能直接使用。 有什么建议?

Answer 1:

答:不要这样做。

UITableview从---->继承UIScrollView : UIView : UIResponder : NSObject

苹果说:

重要提示:你不应该嵌入的UIScrollView对象的UIWebView或UITableView的对象。 如果这样做,可能会导致意外的行为,因为这两个物体的触摸事件可以混合起来,并错误地处理。



Answer 2:

不建议? 它那种感觉就像“不这样做”阅读这一信息。 不可预测性是从来不为应用程序的好行为后,

重要提示:你不应该嵌入的UIScrollView对象的UIWebView或UITableView的对象。 如果这样做,可能会导致意外的行为,因为这两个物体的触摸事件可以混合起来,并错误地处理。



Answer 3:

将分享如何解决了。 难道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];
}


Answer 4:

也许这是晚了,但我设法做到这一点:

  • 禁用滚动上的UITableView
  • 设置的UIScrollView的内容大小后编程我计算高度,我需要


Answer 5:

不应该这样做,因为UITableView的是的UIScrollView的子类,根据苹果的文档。 只需使用自动布局更容易,你计算每一个项目的大小和回采表滚动这样做。

苹果文档 :

你不应该在UIS​​crollView的对象嵌入的UIWebView或UITableView的对象。 如果这样做,可能会导致意外的行为,因为这两个物体的触摸事件可以混合起来,并错误地处理。



文章来源: How to use UITableView inside UIScrollView and receive a cell click?