klc*_*r89 21 objective-c uitableview uisearchdisplaycontroller ios uipageviewcontroller
我在发布这个问题之前搜索过,但找不到任何东西.
我有一个很大的问题.我有一个滚动类型UIPageViewController作为我的应用程序的基础,有3个视图控制器.
其中一个视图控制器(listTableView)具有表视图和搜索显示控制器.
问题是,当像状态表视图一样点击状态栏时,我无法滚动到表格视图的顶部.我相信UIPageViewController正在干扰这个,但我不知道如何修复它,但我知道我需要让我的应用程序不会感到破碎.
我感谢任何提供的帮助.
我知道有人会要求代码,即使在这种情况下它是无关紧要的,但这里是为了创建UIPageViewController:
#import "MainViewController.h"
@interface MainViewController ()
@property (nonatomic, strong) UIPageViewController *pageViewController;
@property (nonatomic, strong) NSArray *contentViewControllers;
@end
@implementation MainViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageView"];
self.pageViewController.dataSource = self;
UIViewController *settings = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings"];
UIViewController *listTableView = [self.storyboard instantiateViewControllerWithIdentifier:@"List"];
UIViewController *first = [self.storyboard instantiateViewControllerWithIdentifier:@"First"];
self.contentViewControllers = [NSArray arrayWithObjects:settings,listTableView,first,nil];
[self.pageViewController setViewControllers:@[first] direction:UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];
[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
[self.pageViewController didMoveToParentViewController:self];
self.view.backgroundColor = [UIColor colorWithRed:(248.0/255.0) green:(248.0/255.0) blue:(248.0/255.0) alpha:1.0];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerBeforeViewController:(UIViewController *)viewController {
NSUInteger index = [self.contentViewControllers indexOfObject:viewController];
if (index == 0) {
return nil;
}
return self.contentViewControllers[index - 1];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerAfterViewController:(UIViewController *)viewController {
NSUInteger index = [self.contentViewControllers indexOfObject:viewController];
if (index >= self.contentViewControllers.count - 1) {
return nil;
}
return self.contentViewControllers[index + 1];
}
Run Code Online (Sandbox Code Playgroud)
Leo*_*ica 30
解
聊天后,我们发现了一些有趣的东西 页面视图控制器将其他视图控制器的视图保留在视图层次结构中,因此它们还捕获scrollsToTop行为并进行干扰.这意味着您需要为消失的视图控制器scrollsToTop内viewWillDisappear:的每个可滚动视图禁用(并再次启用viewWillAppear:).
原始调查
快速简便的方法:scrollview是视图的唯一子UIPageViewController视图:
self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
Run Code Online (Sandbox Code Playgroud)
在调试器中检查:
(lldb) po [self.pageViewController.view recursiveDescription]
<_UIPageViewControllerContentView: 0x8d7c390; frame = (0 0; 320 480); clipsToBounds = YES; opaque = NO; autoresize = W+H; layer = <CALayer: 0x8d7c4a0>>
| <_UIQueuingScrollView: 0xa912800; frame = (0 0; 320 480); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x8d7cc90>; layer = <CALayer: 0x8d7c7e0>; contentOffset: {320, 0}>
| | <UIView: 0x8d7da00; frame = (0 0; 320 480); layer = <CALayer: 0x8d7da60>>
| | <UIView: 0x8d7dab0; frame = (320 0; 320 480); layer = <CALayer: 0x8d7db10>>
| | <UIView: 0x8d7db40; frame = (640 0; 320 480); layer = <CALayer: 0x8d7dba0>>
Run Code Online (Sandbox Code Playgroud)
您可以使用多种方法来访问该滚动视图.最简单的是迭代 self.pageViewController.view.subviews并找到作为子类的子类UIScrollView.由于它是唯一的子视图,因此循环将在一次迭代后结束.
这个解决方案最佳吗?不.它容易出错吗?理论上,当然.它有可能改变吗?不太可能,因为视图层次结构非常合乎逻辑.它至少可以为您提供快速修复,而不必由于Apple的小疏忽(允许用户访问scrollview)来处理更改整个应用程序结构.
您应该通过https://bugreport.apple.com向Apple打开功能请求.
| 归档时间: |
|
| 查看次数: |
5398 次 |
| 最近记录: |