Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否有任何方法可以确保只有一个scrollView实例具有ScrollStop==是?_Ios_Objective C - Fatal编程技术网

Ios 是否有任何方法可以确保只有一个scrollView实例具有ScrollStop==是?

Ios 是否有任何方法可以确保只有一个scrollView实例具有ScrollStop==是?,ios,objective-c,Ios,Objective C,我当前使用的应用程序在多个不同场景中同时具有多个UITableView/UIScrollView实例 当多个实例具有scrollsToTop==YES时,当点击状态栏时,只有一个实例实际滚动到顶部 我正在寻找最简单的解决方案,以确保只有一个scroll view实例(最近的一个)具有scrollsToTop==YES 我用swizzling方法想出了一个解决方案,我不确定这是不是最好的解决方案。我想知道解决这个问题的其他方法或任何建议 以下是我的解决方案: 创建UIScrollView的类别添加

我当前使用的应用程序在多个不同场景中同时具有多个
UITableView
/
UIScrollView
实例

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

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

我用swizzling方法想出了一个解决方案,我不确定这是不是最好的解决方案。我想知道解决这个问题的其他方法或任何建议

以下是我的解决方案:

  • 创建
    UIScrollView
    的类别添加方法
    mySetScrolStotop:

    -(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];
        }
    }
    
  • 使用以下方法创建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];
    
    }
    
  • 使用swizzling方法将
    mySetScrollsToTop
    myViewDidLoad
    myDealloc
    与原始文件交换

  • 编辑:

    对不起,如果我的问题不清楚的话

    每个
    viewcontroller
    都有多个
    tableview
    ,它们由用户切换,例如使用分段控件。当选择了一个
    tableView
    /
    scrollView
    时,我想设置它的
    scrollToTop=YES
    ,并想确保所有其他
    scrollView
    scrollToTop
    都设置为NO

    我正在使用的应用程序左边有一个菜单栏,像Facebook应用程序一样,里面有一个
    UITableView
    ,还有一个选项卡栏,每个选项卡都包含一个
    UITableView
    ,显示在菜单
    UITableView
    上。在右窗格中,还有
    UITableView
    s,可通过分段控制器进行选择和切换。 我想确保只有一个表视图在
    scrollsToTop
    中处于活动状态

    Edit2:

    我打印了窗口的子视图,但未包含我的视图:

    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
    
    Edit3: 我实现了swizzling,它可以工作。然而,我仍然接受任何更好的解决方案。
    谢谢

    scrollsToTop
    对于所有滚动视图,默认设置为
    YES

    使视图控制器成为所有滚动视图的代理,然后执行以下操作:

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

    您可以使用以下方法:

    - (void) disableScrollToTopExceptScrollView:(UIScrollView*) scrollView
    {
        [self internalDisableScrollViewsExceptScrollView:scrollView rootView:self.window];
    }
    
    - (void) internalDisableScrollViewsExceptScrollView:(UIScrollView*) scrollView rootView:(UIView*) root
    {
        NSArray* subviews = root.subviews;
        for(UIView* view in subviews)
        {
            if([view isKindOfClass:[UIScrollView class]])
            {
               if(view==scrollView)
               {
                   [(UIScrollView*)view setScrollsToTop:YES];
               }
                else
                {
                    [(UIScrollView*)view setScrollsToTop:NO];
                }
            }
            [self internalDisableScrollViewsExceptScrollView:scrollView rootView:view];
        }
    }
    

    例如,在AppDelegate类中实现它们,并从应用程序中的任何点调用-这将禁用应用程序视图层次结构中的所有滚动视图,但您传递的视图除外。

    抱歉,我认为我的问题令人困惑。我编辑我的问题。谢谢@kazuochi更新了我的答案,以解决您更新的问题。我必须处理同一viewController中不必要的所有tableView。例如,我有左菜单栏,其中包含tableView。当左侧菜单表处于活动状态以滚动至顶部并隐藏在右侧窗格下时,当点击状态栏时,右侧窗格中的任何tableView都不会向上滚动。要解决这个问题,我必须禁用leftMenu栏的ScrollStop,并在关闭左窗格时启用右窗格的活动tableView。我试图在不考虑所有可能的情况下解决这个问题。无论如何谢谢你!在不是当前视图控制器的视图控制器中的滚动视图在点击顶部栏时不应滚动到顶部,即使
    scrollsToTop==YES
    。但是右窗格上的tableView不会向上滚动,除非禁用左窗格上隐藏的tableView的scrollsToTop。我打印了UIWindow的所有子视图,但是它没有我的视图。我打印了UIView的子视图,但在那里也找不到任何视图。谢谢每次切换ScrollView时尝试调用此方法-将active scroll view作为应保持活动的视图传递,并将应用程序的窗口作为根视图传递。嗨,窗口的子视图不包含任何“我的视图”。我使用了一个递归地挖掘子视图并打印出子视图的类名的方法进行了确认。输出在Edit2中。谢谢
    - (void) disableScrollToTopExceptScrollView:(UIScrollView*) scrollView
    {
        [self internalDisableScrollViewsExceptScrollView:scrollView rootView:self.window];
    }
    
    - (void) internalDisableScrollViewsExceptScrollView:(UIScrollView*) scrollView rootView:(UIView*) root
    {
        NSArray* subviews = root.subviews;
        for(UIView* view in subviews)
        {
            if([view isKindOfClass:[UIScrollView class]])
            {
               if(view==scrollView)
               {
                   [(UIScrollView*)view setScrollsToTop:YES];
               }
                else
                {
                    [(UIScrollView*)view setScrollsToTop:NO];
                }
            }
            [self internalDisableScrollViewsExceptScrollView:scrollView rootView:view];
        }
    }