gpt4 book ai didi

ios - 有什么办法可以确保只有一个 scrollView 实例具有 scrollsToTop == YES?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:48:19 26 4
gpt4 key购买 nike

我目前正在开发的应用程序在多个不同的场景中同时具有多个 UITableView/UIScrollView 实例。

当多个实例具有 scrollsToTop == YES 时,只有一个实例在点击状态栏时实际滚动到顶部。

我正在寻找最简单的解决方案以确保 ScrollView 只有一个实例(最近的一个)具有scrollsToTop == YES

我想出了一个使用方法调整的解决方案,我不确定这是否是最佳解决方案。我想知道解决此问题的任何其他方法或任何类型的建议。

这是我的解决方案:

  1. 创建UIScrollView的类别添加方法mySetScroolsToTop:

    -(void)mySetScrollsToTop:(BOOL)scrollsToTop{
    [self mySetScrollsToTop:scrollsToTop];

    if(scrollsToTop){
    [[NSNotificationCenter defaultCenter]
    postNotificationName:SetScrollsToTopNotification object:self];
    }

    }

    -(void)scrollsToTopIsSet:(NSNotification *)notification{

    if(notification.object != self){
    [self mySetScrollsToTop:NO];
    }
    }
  2. 使用以下方法创建 UIViewController 的类别

    -(void)myViewDidLoad{

    self findScrollViewAndObserveScrollToTopNotification:self.view];

    [self myViewDidLoad];

    }


    -(void)findScrollViewAndObserveScrollToTopNotification:(UIView *)view{

    for(UIView* v in view.subviews){

    if([v isKindOfClass:[UIScrollView class]]){

    [[NSNotificationCenter defaultCenter] addObserver:v
    selector:@selector(scrollsToTopIsSet:)
    name:kSetScrollsToTopNotification
    object:nil];
    }

    [self findScrollViewAndObserveScrollToTopNotification:v];

    }
    }

    -(void)myDealloc{

    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [self myDealloc];

    }
  3. 使用 method swizzlingmySetScrollsToTopmyViewDidLoadmyDealloc 替换为原来的。 p>

编辑:

抱歉,如果我的问题不清楚。

每个 viewcontroller 都有多个 tableViews 并且它们由用户切换,例如分段控制。选择 tableView/scrollView 时,我想设置它的 scrollToTop = YES 并希望确保所有其他 scrollViewscrollsToTop 设置为 NO。

我正在开发的应用程序有一个像 Facebook 应用程序一样的左菜单栏,里面有一个 UITableView 和一个标签栏,每个标签包含一个 UITableView 这是显示在菜单 UITableView 上。在右 Pane 中,还有 UITableView 可以通过分段 Controller 进行选择和切换。我想确保只有一个表格 View 对 scrollsToTop 有效。

编辑2:

我打印出窗口的 subview ,但不包含我的 View :

2013-05-16 10:44:01.416  UIView
2013-05-16 10:44:01.417 UILayoutContainerView
2013-05-16 10:44:01.417 UINavigationTransitionView
2013-05-16 10:44:01.417 UIView
2013-05-16 10:44:01.417 UILayoutContainerView
2013-05-16 10:44:01.417 UINavigationTransitionView
2013-05-16 10:44:01.417 UINavigationBar
2013-05-16 10:44:01.417 _UINavigationBarBackground
2013-05-16 10:44:01.417 UIImageView
2013-05-16 10:44:01.418 UIButton
2013-05-16 10:44:01.418 UIImageView
2013-05-16 10:44:01.418 UIImageView

编辑 3:我实现了 swizzling 并且它有效。但是,我仍然接受任何更好的解决方案。谢谢!

最佳答案

scrollsToTop 对于所有 ScrollView 默认为 YES

让你的 View Controller 成为你所有 ScrollView 的委托(delegate),然后实现这个:

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
return (scrollView == <the only scroll view you want to scroll to the top>);
}

当点击顶部栏时,scrollViewShouldScrollToTop: 将被调用,您应该为要滚动的 ScrollView 返回 YES。

编辑更新的问题:

这将满足您的要求。

// Set `scrollsToTop` to false for every scroll view of every view controller
for (UIViewController *controller in self.navigationController.viewControllers)
for (id obj in controller.view.subviews)
if ([obj isKindOfClass:[UIScrollView class]])
((UIScrollView*)obj).scrollsToTop = NO;

// Set `scrollsToTop` to true for whichever scroll view is currently visible
activeScrollView.scrollsToTop = YES;

关于ios - 有什么办法可以确保只有一个 scrollView 实例具有 scrollsToTop == YES?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16576682/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com