相关疑难解决方法(0)

AutoLayout:removeFromSuperview/removeConstraints抛出异常并严重崩溃

我们有选择地使用自动布局约束,主要是为了定位与可编辑字段元素相关的标签(通常是UITextView,UITextField).但是,自从为这些字段实现自动布局以来,每当我们卸载视图,解除分配等时,我们都会看到一个令人讨厌的异常并崩溃.异常发生的原因是它试图在卸载视图之前从视图中删除约束.

我们的视图/控制器层次结构如下:

UITableViewController (plain style, but with cell appearance to mimic grouped style)
--> UITableViewCell
----> UIViewController (container for editable form)
------> UICollectionViewController (editable form)
--------> UICollectionViewCell
-----------> UIViewController (editable field)
--------------> UILabel (field label)                   **HAS CONSTRAINTS**
--------------> UITextView / UITextField (field value)  **HAS CONSTRAINTS**
Run Code Online (Sandbox Code Playgroud)

很多时候,当上层表格单元被解除分配/替换/重新加载时,我们会看到一个巨大的异常,然后崩溃,因为它试图释放/卸载其中的视图层次结构.

我试图通过捕获异常(没有帮助)并通过在释放/卸载(in viewWillDisappear:)之前强制删除受影响的视图和所有子视图上的所有约束来缓解崩溃,它似乎没有帮助.我甚至试图逐个删除这些约束,看看是否有一个特别是导致麻烦但是当我们打电话removeConstraint:removeConstraints:在容器上准备消失时它们都会爆炸.

我很困惑!这是我们例外的一小部分 - 大约有3000行被切断了,所以如果你需要更多,请问.

Exception while deallocating view: { Rows:
    0x18911270.posErrorMarker == 4 + 1*0x18911270.negError + 1*0x189112f0.marker + -1*0x189113f0.negError + 1*0x189113f0.posErrorMarker + 1*0x18911a60.marker + -0.5*0x1892dae0.negError + 0.5*0x1892dae0.posErrorMarker + …
Run Code Online (Sandbox Code Playgroud)

ios automatic-ref-counting autolayout

53
推荐指数
2
解决办法
2万
查看次数

UICollectionViewData中的断言失败indexPathForItemAtGlobalIndex

我正在使用performBatchUpdates()来更新我的集合视图,我正在进行完全刷新,即删除其中的任何内容并重新插入所有内容.批量更新是作为附加到()的Observer的一部分完成的.NSMutableArraybingDataItems

cellItems是包含要或将要插入到集合视图中的项的数组.

这是代码:

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    cultARunner *_cultARunner = [cultARunner getInstance];
    if ( [[_cultARunner bingDataItems] count] ) {
        [self.collectionView reloadData];
        [[self collectionView] performBatchUpdates: ^{

            int itemSize = [cellItems count];
            NSMutableArray *arrayWithIndexPaths = [NSMutableArray array];

            // first delete the old stuff
            if (itemSize == 0) {
                [arrayWithIndexPaths addObject: [NSIndexPath indexPathForRow: 0 inSection: 0]];
            }
            else {
                for( int i = 0; i < cellItems.count; i++ ) { …
Run Code Online (Sandbox Code Playgroud)

objective-c ios uicollectionview

27
推荐指数
4
解决办法
2万
查看次数

AutoLayout视图使popViewController上的应用程序崩溃

最终更新 - 修正

我修好了.看来尽管玩弄(这是我在斯威夫特的第一个项目,并使用自动版式)我已经改变了contentCompressionResistancePrioritycontentHuggingPriority对我的一些看法.取出该代码并将我的所有视图重置为IB中的默认值修复了我的问题.

初始帖子

所以我在iOS上使用AutoLayout来定位我的动态视图.在我弹出一个视图控制器之前,这一切都很好用.该应用程序崩溃了一个非常有用的错误消息,如下所示:

...
internal error.  Cannot find an outgoing row head for incoming head UIImageView:0xd049d50.Width{id: 730}, which should never happen.'
...
Run Code Online (Sandbox Code Playgroud)

我一直在瞎逛,搜索网络,但我无法修复它.我发现虽然我的代码中有一行可以有所作为.在我说的视图控制器中,我有一堆UIImageViews正在使用AutoLayout以及我从网上加载的图像.

如果不是将我收到的图像设置给他们,我在Swift中设置一个空的([[UIImage alloc] init]或者UIImage()),就像我的情况一样)它不会再崩溃了.

我甚至尝试从应用程序包中设置一个虚拟图像,但这也使它崩溃了.

我们欢迎所有的建议!

更新1

通过再次查看代码,我还发现存在一个与那些UIImageViews也会使崩溃在消除时消失的约束.它是宽高比约束,看起来像这样

imageView.addConstraint(NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: imageView, attribute: NSLayoutAttribute.Height, multiplier: 8.0 / 5.0, constant: 0.0))
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?我真的需要满足这个宽高比,所以我不能真正删除它

更新2

再多说一点,我想办法让它发挥作用.但是我对此并不满意,因为它并没有让我明白发生了什么,这是一种黑客攻击

让我为您构建我的视图结构:

  • 视图
    • 滚动视图
      • 内容查看
        • 封面ImageView(来自IB)
        • 标题标签(来自IB)
        • ...更多来自代码的随机顺序的标签或ImageViews ...

这些视图的放置方式如下:

  • Cover ImageView的宽度ContentView …

objective-c ios autolayout swift

6
推荐指数
2
解决办法
6678
查看次数