9

使用 SDK 6.1、Xcode 4.6.1,我制作了一个新项目 Master-Detail iOS App,ARC,没有故事板。

然后在DetailViewController, 在s 中viewDidLoad添加两个s并确保第二个像这样隐藏:UITableViewUIViewController

- (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 行UITableViewCells 并textLabel.text设置为@"hello"

第二个视图控制器的存在使得scrollsToTop(点击状态栏)不再起作用。如果我不使用UIViewController遏制并且只添加两个UITableViews 并将第二个设置为隐藏,scrollsToTop则可以。

我究竟做错了什么?

4

5 回答 5

8

scrollsToTop仅适用于单个可见视图。从文档中:

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

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

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
    [lTableView1 setContentOffset:CGPointZero animated:YES];
    [lTableView2 setContentOffset:CGPointZero animated:YES];
    return NO;
}
于 2013-04-15T07:54:53.467 回答
4

您只能使用属性 .scrollsToTop = YES 为每个 ViewController设置1 个ScrollView 。如果您设置 2 scrollview.scrollsTopTop = YES,它将停止运行。

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

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

然后,scrollsToTop 正常工作。如果您希望同时设置 ScrollsToTop 的滚动视图超过 1 个,请继续挖掘。祝你好运!

于 2013-04-16T08:50:28.543 回答
3

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

lViewController2.view.hidden = YES;

被替换为

lTableView2.hidden = YES;

然后滚动工作,即使有控制器遏制。

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

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

结果:根据我的实验,只有一个滚动视图必须在视图层次结构中可见,并且hidden未检出父视图的属性。hidden必须NO在所有其他滚动视图上设置为,而不是在它们的父视图上。

于 2013-04-18T14:36:21.127 回答
0

在测试了几个选项和各种命中并尝试之后,我终于确定了一个最终解决方案,即(setBounds:在你的情况下)并且效果很好。不过,您必须为动画付出额外的努力。scrollViewtableView

    CGRect frame = scrollView.frame;
    frame.origin.x = 0;
    frame.origin.y = 0;
    [scrollView setBounds:frame];

顺便说一句,在您的情况下,请尝试YES返回

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

虽然如果没有定义,假设是。

于 2013-04-17T07:06:50.207 回答
0

我已经使用了它,现在它工作正常。

- (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;
}
于 2013-04-18T13:58:28.723 回答