似乎UIPageViewController永远保存着初始内容视图控制器.例如:
DataViewController *startingViewController = [self.modelController viewControllerAtIndex:0 storyboard:self.storyboard];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];
self.pageViewController.dataSource = self.modelController;
Run Code Online (Sandbox Code Playgroud)
该startingViewController永远不会释放,直到pageViewController它本身释放.
要重现此错误,只需使用基于页面的应用程序模板在XCode中创建一个新项目.并在DataViewController.m中添加3行代码
@property NSInteger debugIndex; // file scope
NSLog(@"DataViewController[%d] created", self.debugIndex); // in viewDidLoad
NSLog(@"DataViewController[%d] dealloc", self.debugIndex); // in dealloc
Run Code Online (Sandbox Code Playgroud)
当您以垂直方向滚动演示应用程序时,您将获得如下日志:
DataViewController[0] created
DataViewController[1] created
DataViewController[2] created
DataViewController[1] dealloc
DataViewController[3] created
DataViewController[2] dealloc
DataViewController[4] created
DataViewController[3] dealloc
DataViewController[5] created
DataViewController[4] dealloc
DataViewController[6] created
DataViewController[5] dealloc
Run Code Online (Sandbox Code Playgroud)
DataViewController [0]永远不会被释放.
有关于此的任何想法?谢谢!
我正在开发一个应用程序,其中有几个屏幕,每个屏幕具有相同的布局,只传入不同的数据,然后我希望用户能够从一个屏幕滑动到下一个屏幕.
到目前为止,我UIPageViewController
使用过渡样式使用项目模板UIPageViewControllerTransitionStyleScroll
.到目前为止我所做的工作还可以,虽然资源密集,因为每次我刷到一个新页面时它都会实例化一个新的视图控制器,但我正在努力解决这个问题.
我关心的事情是,它不是严格的iBooks意义上的网页应用程序,这样即使我能够使它看起来像一个滚动的应用程序,使用的过渡样式设置,我不知道是否有一个人之所以似乎只对书籍类型的应用程序使用此模板,除非我弄错了
似乎还有一种使用UIScrollView
和PageControl
执行类似功能的替代方法
http://developer.apple.com/library/ios/#samplecode/PageControl/Introduction/Intro.html
我不确定哪种方法可以更好地解决我想要解决的问题,所以我正在寻找一些反馈.每个页面都需要是视图控制器的单独实例,因为每个页面上都有几个要显示的元素.
我有一个UIPageViewController
.一个页面只有一个按钮,另一个页面有UITextField
一个按钮.当页面滚动到带有字段的视图时,我想要它becomeFirstResponder
并打开键盘.这是发生的事情:
我调用了[self.locationQuery becomeFirstResponder]
ViewController的viewDidAppear
方法.但它永远不会打开键盘.
我做同样的事情viewWillAppear
,它看似简短,但后来很快就被解雇了.
如果我在带有文本字段的页面上,并将页面拉到中途并放开(不更改页面),则self.locationQuery
获得焦点就好了.
似乎其他东西正在从字段中获取firstResponder状态,但我不知道什么是什么,以及为什么它只会在页面发生变化时发生(而不是在页面转向失败后显示).有任何想法吗?
更新
我创建了一种方法来抓取视图以查看是否有任何其他视图确实采用firstResponder(来自此问题的答案:在不使用私有API的情况下获取当前的第一响应者).结果:
当我明确地将第一响应者提供给文本字段时,该方法报告它具有第一响应者状态.
当我不这样做时,它会返回null
.
现在我更加困惑.
我有一个UIPageViewController
子类,并在其viewDidLoad
我想将添加UILabel
到它self.view
.如果我使用框架设置其位置,这可以正常工作,但如果我尝试使用自动布局定位它,我得到:
*断言失败 - [_ UIPageViewControllerContentView layoutSublayersOfLayer:],/ SourceCache/UIKit_Sim/UIKit-2935.58/UIView.m:8742
我该怎么定位这个UILabel出现在UIPageViewController
?
我有一个显示不同页面的UIPageViewController.当前的行为是当我到达最后一页时它停止滚动.我现在想要实现的是,当在最后一页并向右滚动时,它会转到第一页.在第一页时,向左滚动时转到最后一页.所以基本上让PageViewController以圆圈形式显示页面.我的第一种方法在有多个页面或从一个页面开始时效果很好:
- (UIViewController*) pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(TMCollectionViewController *)viewController
{
if((viewController.pageIndex) >= 1)
{
return _viewControllers[viewController.pageIndex - 1];
}
else
{
if ([_viewControllers count] == 1) {
return nil;
}
return [_viewControllers objectAtIndex:[_viewControllers count]-1];
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我删除页面以便只剩下一个页面时,它仍然会记住页面之前或之后,并相应地显示它.即使数组中只剩下一页.任何帮助都非常感谢.
我正在开发一个UIPageViewController
有两页的简单.每个页面都是从不同的页面加载ViewController
其特定xib
文件,名为PViewController
和TViewController
.
对于PViewController
,有三种不同的意见,我们姑且称之为一,乙,和Ç.当应用程序启动时,PViewController
显示成功,我可以向左滑动查看TViewController
,也没有问题.但是,当我进入PViewController
并作为对事件的响应时,我将当前视图A更改为另一个视图B,然后向左滑动转到TViewController
,我收到以下异常,应用程序终止:
*** Assertion failure in -[_UIQueuingScrollView _setWrappedViewAtIndex:withView:], /SourceCache/UIKit_Sim/UIKit-2935.137/_UIQueuingScrollView.m:338
2014-07-10 13:57:23.389 ***** [2012:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unexpected subviews'
*** First throw call stack:
(
0 CoreFoundation 0x01fde1e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x01c418e5 objc_exception_throw + 44
2 CoreFoundation 0x01fde048 +[NSException raise:format:arguments:] + 136
3 …
Run Code Online (Sandbox Code Playgroud) 当应用程序第一次启动并使用时,我正在制作教程UIPageViewController
.一切都很好,但背景颜色UIPageViewController
不透明.它总是黑色的,如下所示:
这是我添加的方式UIPageViewController
(在tabbar控制器中)
.h文件:
@interface CHMainTabViewController : UITabBarController <UIPageViewControllerDataSource>
@property (strong, nonatomic) UIPageViewController *pageViewController;
@end
Run Code Online (Sandbox Code Playgroud)
.m文件(in viewDidLoad
):
// Create page view controller
self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
self.pageViewController.dataSource = self;
self.pageViewController.view.backgroundColor = [UIColor clearColor];
TutorialViewController *startingViewController = [self viewControllerAtIndex:0];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
[self presentViewController:_pageViewController animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
在我的AppDelegate.m中,我还设置了UIPageControl
背景颜色以清除:
UIPageControl *pageControl = [UIPageControl appearance];
pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
pageControl.backgroundColor = [UIColor clearColor];
[pageControl setOpaque:NO];
self.window.backgroundColor …
Run Code Online (Sandbox Code Playgroud) objective-c uipagecontrol ios uipageviewcontroller uibackgroundcolor
我有一个tableView
内部,pageViewController
当在一个单元格上滑动以显示删除单元格的选项时,只有在某些情况下才能识别出手势,比如说你快速而且积极地滑动.
我想这会发生,因为它不确定滑动手势是用于pageView
还是用于tableView
.有没有办法专门确定滑动手势发生的位置,以便能够顺利显示删除按钮?
我正在尝试UIPageViewController
在进行翻转动画时改变阴影颜色.但它总是只显示白色.如何将翻转背景颜色白色的颜色更改为其他颜色(黑色或sephia).iBook也在做同样的事情.
我提到下面的图像有白色bg,颜色我会改变.
截图:
我遇到了一些问题UIPageViewController
.如果我滚动到了新的一页,新的视图控制器是落后的状态栏,而我在滚动.滚动后,视图控制器将自身置于状态栏下方.
我正在使用Storyboard(Universal).UIPageViewController
有属性Extend Edges: Under Top Bars
.我错过了什么?
automaticallyAdjustsScrollViewInsets
为false不起作用edgesForExtendedLayout = UIRectEdge.None
也没有用UPDATE
跳跃的另一个原因是来自'Constraints'的'边缘'(在这里找到).如果使用约束,请确保取消选中边距(右对话框).您可以稍后在"实用程序"中将其删除(左侧对话框).检查两个连接的视图!
ios ×8
objective-c ×5
swift ×2
autolayout ×1
exception ×1
memory-leaks ×1
statusbar ×1
tableview ×1
uiscrollview ×1
uiview ×1