childVC
添加到parentVC
childVC.view
为什么?
我刚遇到一个奇怪的行为,我想知道它是否正常或是否是一个错误。
我有一个视图控制器childVC
,它是parentVC
的孩子。创建父/子关系时,我的代码是
[parentVC addChildViewController:childVC] ;
[parentVC.view addSubview:childVC.view] ;
[childVC didMoveToParentViewController: parentVC] ;
进一步说,我想创建childVC.view
的快照。我的代码是
UIView * view = childVC.view ;
UIGraphicsBeginImageContextWithOptions(view.contentSize, NO, 0);
{
[...]
[view drawViewHierarchyInRect:view.bounds
afterScreenUpdates:YES];
image = UIGraphicsGetImageFromCurrentImageContext();
[...]
}
UIGraphicsEndImageContext();
然后我有错误:
*由于未捕获的异常终止应用' UIViewControllerHierarchyInconsistency',原因:'子视图 控制器:应该有父 view controller :( null)但是实际的父级是:' * 第一次抛出调用堆栈:(0 CoreFoundation 0x0260b466 __exceptionPreprocess + 182 1 libobjc.A.dylib
0x02290a97 objc_exception_throw + 44 2 CoreFoundation
0x0260b38d + [NSException raise:format:] + 141 3 UIKit
0x01136710 - [UIView(Hierarchy) _associatedViewControllerForwardsAppearanceCallbacks:performHierarchyCheck:isRoot:] + 352 4 UIKit 0x01136b13 - [UIView(Hierarchy)_willMoveToWindow:withAncestorView:] + 285 5 UIKit 0x0114330a - [UIView(Internal) _addSubview:locate:relativeTo:] + 511 6 UIKit 0x01136252 - [UIView(Hierarchy)addSubview:] + 56 7 UIKit
0x0114ab0e + [_ UIReplicantView _pendingSnapshotOfTarget:snapshotBlock:] + 584 8 UIKit 0x011312fe - [UIView drawViewHierarchyInRect:afterScreenUpdates:] + 287
为什么会这样?我可以解决这个问题吗?
实际上,childVC.view
是UIScrollView
,快照的代码是
UIScrollView * scrollView = (UIScrollView *)childVC.view;
UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, NO, 0);
{
CGPoint savedContentOffset = scrollView.contentOffset;
CGRect savedFrame = scrollView.frame;
scrollView.contentOffset = CGPointZero;
scrollView.frame = CGRectMake(0,
0,
scrollView.contentSize.width,
scrollView.contentSize.height);
[scrollView drawViewHierarchyInRect:scrollView.bounds
afterScreenUpdates:YES];
image = UIGraphicsGetImageFromCurrentImageContext();
scrollView.contentOffset = savedContentOffset;
scrollView.frame = savedFrame;
}
UIGraphicsEndImageContext();
也许这会产生很大的不同。
答案 0 :(得分:1)
今天,在使用CREATE FUNCTION func2()
RETURNS trigger AS $$
DECLARE
value DATE;
BEGIN
SELECT CURRENT_DATE INTO value;
SET NEW.date=value;
RETURN NULL;
END;
$$LANGUAGE plpgsql;
CREATE TRIGGER date
AFTER UPDATE ON table
FOR EACH ROW
EXECUTE PROCEDURE func2();
实现自定义转换时遇到了同样的问题。问题在于,当我尝试对子视图控制器进行快照时,其父控制器还不属于视图层次结构。
解决方案是在尝试为子级创建快照之前,确保已将父级视图添加到视图层次结构中。就我而言,我只需要先将“至”视图控制器添加到UIViewControllerAnimatedTransitioning
。
从您的代码片段中,我无法确定您何时尝试拍摄快照。但是,如果在transitionContext.containerView
之前,则可能无效。
答案 1 :(得分:0)
在使用view.snapshotView(afterScreenUpdates: true)
从子视图控制器的视图中删除子视图控制器的视图之前,我遇到了崩溃。
对我来说,将false
传递给afterScreenUpdates
解决了这个问题。
答案 2 :(得分:-1)
也许您的父视图控制器被取消分配,因此异常消息中的(null)
?