Iphone ScrollStopTop不使用UIViewController容器

Iphone ScrollStopTop不使用UIViewController容器,iphone,ios,uiviewcontroller,Iphone,Ios,Uiviewcontroller,使用SDK 6.1、Xcode 4.6.1,我制作了一个新的项目主控详细信息iOS应用程序ARC,无情节提要 然后在DetailViewController中,在viewDidLoad中添加两个UITableViews(包含在UIViewControllers中),并确保第二个像这样隐藏: - (void)viewDidLoad { [super viewDidLoad]; UIViewController *lViewController1 = [[UIViewControl

使用SDK 6.1、Xcode 4.6.1,我制作了一个新的项目主控详细信息iOS应用程序ARC,无情节提要

然后在
DetailViewController
中,在
viewDidLoad
中添加两个
UITableView
s(包含在
UIViewController
s中),并确保第二个像这样隐藏:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIViewController *lViewController1 = [[UIViewController alloc] init];
    UITableView *lTableView1 = [[UITableView alloc] initWithFrame: self.view.frame];
    lTableView1.scrollsToTop = YES;
    [lViewController1.view addSubview: lTableView1];
    lTableView1.dataSource = self;
    [self.view addSubview: lViewController1.view];
    [self addChildViewController: lViewController1];

    UIViewController *lViewController2 = [[UIViewController alloc] init];
    UITableView *lTableView2 = [[UITableView alloc] initWithFrame: self.view.frame];
    lTableView2.scrollsToTop = YES;
    [lViewController2.view addSubview: lTableView2];
    lTableView2.dataSource = self;
    [self.view addSubview: lViewController2.view];
    [self addChildViewController: lViewController2];

    // now hide the view in view controller 2
    lViewController2.view.hidden = YES;
}
(我确保
DetailViewController
是一个返回100行
UITableViewCell
s的数据源,其中
textlab.text
设置为
@“hello”

第二个视图控制器的存在使得
滚动STOTOP
(点击状态栏)不再工作。如果我不使用
UIViewController
containment,只需添加两个
UITableView
s并将第二个设置为隐藏,
scrollsToTop
就可以工作了


我做错了什么?

ScrollStop
仅在单个可见视图上工作。从:

此手势适用于单个可见的滚动视图;如果有多个滚动视图(例如,日期选择器)设置了此属性,或者如果委托在
scrollViewShouldScrollToTop:
中返回
NO
UIScrollView
将忽略该请求。滚动视图滚动到内容视图的顶部后,它会向代理发送一条
scrollViewDidScrollToTop:
消息

您可以尝试手动调用每个表(或滚动)视图上的
[tableView setContentOffset:CGPointZero animated:YES]
。为此,在
UIScrollViewDelegate
协议中实现
scrollViewShouldScrollToTop:
方法:

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
    [lTableView1 setContentOffset:CGPointZero animated:YES];
    [lTableView2 setContentOffset:CGPointZero animated:YES];
    return NO;
}
您只能使用属性为每个ViewController设置1个ScrollView。scrollsToTop=YES。 如果将2 scrollview.scrollsTopTop设置为YES,它将停止工作

ie: your sample project (DetailViewController.m) update following lines,

line48:    lTableView1.scrollsToTop = YES; 
line56:    lTableView2.scrollsToTop = NO;

然后,scrollsToTop可以正常工作。如果有多个scrollview要同时设置ScrollStop,请继续挖掘。祝你好运

在测试了几个选项和各种点击并尝试之后,我最终确定了一个最终解决方案,即
设置:
滚动视图的
(在您的情况下是
表格视图
),效果很好。不过,你必须为动画付出额外的努力

    CGRect frame = scrollView.frame;
    frame.origin.x = 0;
    frame.origin.y = 0;
    [scrollView setBounds:frame];
顺便说一下,在您的情况下,请尝试将
YES
返回到

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;

虽然没有定义,但假设是。

我已经使用过这个,现在它可以正常工作了

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

    UIViewController *lViewController1 = [[UIViewController alloc] init];
    UITableView *lTableView1 = [[UITableView alloc] initWithFrame: self.view.frame];
    lTableView1.scrollsToTop = YES;
    [lViewController1.view addSubview: lTableView1];
    lTableView1.dataSource = self;
    [self.view addSubview: lViewController1.view];
    [self addChildViewController: lViewController1];
    lTableView1.tag=1;

    UIViewController *lViewController2 = [[UIViewController alloc] init];
    UITableView *lTableView2 = [[UITableView alloc] initWithFrame: self.view.frame];
    lTableView2.scrollsToTop = NO;
    [lViewController2.view addSubview: lTableView2];
    lTableView2.dataSource = self;
    [self.view addSubview: lViewController2.view];
    [self addChildViewController: lViewController2];
    lTableView2.tag=2;
    // now hide the view in view controller 2
    lViewController2.view.hidden = YES;

}

- (NSUInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSUInteger)section {
    return 50;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath      *)indexPath {
    static NSString * const kCellIdentifier = @"MyCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"hello %d %d",indexPath.row, tableView.tag];
    return cell;
}

我目前正在试验你的项目。什么时候

lViewController2.view.hidden = YES;
被替换为

lTableView2.hidden = YES;
然后滚动工作,即使控制器包含

我试图在控制器的视图和表之间插入一个视图,然后隐藏这个视图,但是表没有滚动

我试图通过试验
shouldAutomaticallyForwardAppearanceMethods
来隐藏控制器,但表没有滚动


结果:根据我的实验,在视图层次结构中只能看到一个滚动视图,并且父视图的
hidden
属性未检出<代码>隐藏
必须在所有其他滚动视图上设置为
,而不是它们的父视图。

只有一个可见的滚动视图(请参见viewDidLoad中代码的最后一行)。在我的dropbox上放置一个可下载的存档:我假设在滚动到顶部事件之前,您将
隐藏
设置为
。无论如何,在模拟器和iPhone4上,在Xcode 4.6.1+iOS SDK 6.1上尝试了您的测试项目,并且两种方法都有效。您查看了详细视图了吗?主视图有效,但局部视图无效。下载项目:我猜苹果的代码在搜索带有“scrollsToTop”的视图时,不会检查视图是否隐藏。是否有理由使用“隐藏”而不是将子视图删除/添加到superview?它会检查。如果您不使用视图控制器包含,它可以工作。除非其中一个表视图被隐藏,否则它们可以将两个ScrollStop都设置为YES。除非您使用视图控制器包含,否则它将不再工作,这是我正在寻求答案的问题。您可以将其设置为隐藏:、从SuperView中移除或设置为CrollStotop:否,只要只设置了1个scrollView来响应ScrollsToTop:scrolling事件。下载示例代码,您就会发现不使用视图控制器包含(将define view\u CONTROLLERS in DetailViewController设置为0),拥有两个ScrollsToTop表视图没有问题。我不太确定是否理解您的答案。你是在建议ScrollStop的自定义实现吗?好的,但在我的项目中,这不是一个选项,也不是问题的答案。谢谢:)我问这个问题是因为市场上现有项目中存在一个bug,我们希望最大限度地减少对现有版本的更改。这就是我迄今为止忽略的问题:父视图的隐藏属性未检出。通过使用视图控制器包含,我在视图层次结构中添加了一个额外的级别,并更改了父视图而不是表视图的隐藏属性。我想苹果可以更好地记录这一点(如果它不是一个bug的话)。很好的一个——我使用了“隐藏的滚动视图,甚至不包含自己的手势识别器,它只是用来滚动其他内容”的技术,而这个问题是因为我隐藏了它。那么你只是在更改一个ScrollStop属性?这不是我想要的答案(同时苏丹的答案也被接受了)。