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];
}
}
-(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];
}
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];
}
}