Странный сбой при отклонении диспетчера просмотров, авто-макета виноват?

Я испытываю очень странный крах, вот обратная линия.

* thread #1: tid = 0x2403, 0x3379516c CoreFoundation`CFHash + 8, stop reason = EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xdefe) frame #0: 0x3379516c CoreFoundation`CFHash + 8 frame #1: 0x33797a9c CoreFoundation`CFBasicHashRemoveValue + 1408 frame #2: 0x337974ee CoreFoundation`CFDictionaryRemoveValue + 166 frame #3: 0x3420988e Foundation`-[NSISEngine removeConstraintWithMarker:] + 562 frame #4: 0x34211dbe Foundation`-[NSLayoutConstraint _removeFromEngine:] + 230 frame #5: 0x35a954ec UIKit`-[UIView(UIConstraintBasedLayout) _layoutEngine_willRemoveLayoutConstraint:] + 44 frame #6: 0x358488fc UIKit`__48-[UIScrollView _setAutomaticContentConstraints:]_block_invoke_0 + 148 frame #7: 0x34208882 Foundation`-[NSISEngine withAutomaticOptimizationDisabled:] + 166 frame #8: 0x35848838 UIKit`-[UIScrollView _setAutomaticContentConstraints:] + 116 frame #9: 0x35848e6c UIKit`-[UIScrollView _rememberDependentConstraint:] + 112 frame #10: 0x35a9e3ae UIKit`___updateViewDependenciesForConstraint_block_invoke_0 + 30 frame #11: 0x35a954ba UIKit`_updateViewDependenciesForConstraint + 202 frame #12: 0x35a953da UIKit`-[UIView(UIConstraintBasedLayout) _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:] + 154 frame #13: 0x35a95534 UIKit`-[UIView(UIConstraintBasedLayout) _tryToAddConstraintWithoutUpdatingConstraintsArray:roundingAdjustment:mutuallyExclusiveConstraints:] + 36 frame #14: 0x3567c2e0 UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] + 376 frame #15: 0x356d34fe UIKit`-[UIScrollView _didMoveFromWindow:toWindow:] + 50 frame #16: 0x3567c5c6 UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] + 1118 frame #17: 0x35676e52 UIKit`-[UIView(Hierarchy) _postMovedFromSuperview:] + 138 frame #18: 0x3565e7dc UIKit`-[UIView(Internal) _addSubview:positioned:relativeTo:] + 1300 frame #19: 0x3565e2c2 UIKit`-[UIView(Hierarchy) addSubview:] + 30 frame #20: 0x356f68e8 UIKit`-[UITransitionView transition:fromView:toView:removeFromView:] + 972 frame #21: 0x35937618 UIKit`__91-[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:]_block_invoke_0238 + 388 frame #22: 0x357499b8 UIKit`-[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 4824 frame #23: 0x357b9814 UIKit`-[UIViewController _dismissViewControllerWithTransition:from:completion:] + 1708 frame #24: 0x357057c4 UIKit`-[UIViewController dismissViewControllerWithTransition:completion:] + 912 frame #25: 0x000ccd40 Capture`-[INFTagSearchViewController cancelButtonTouched:](self=0x1f09ed50, _cmd=0x001b9d5f, sender=0x1e0265c0) + 76 at INFTagSearchViewController.m:48 frame #26: 0x357470c4 UIKit`-[UIApplication sendAction:to:from:forEvent:] + 72 frame #27: 0x35747076 UIKit`-[UIApplication sendAction:toTarget:fromSender:forEvent:] + 30 frame #28: 0x35747054 UIKit`-[UIControl sendAction:to:forEvent:] + 44 frame #29: 0x3574690a UIKit`-[UIControl(Internal) _sendActionsForEvents:withEvent:] + 502 frame #30: 0x35746e00 UIKit`-[UIControl touchesEnded:withEvent:] + 488 frame #31: 0x3566f5f0 UIKit`-[UIWindow _sendTouchesForEvent:] + 524 frame #32: 0x3565c800 UIKit`-[UIApplication sendEvent:] + 380 frame #33: 0x3565c11a UIKit`_UIApplicationHandleEvent + 6154 frame #34: 0x373655a2 GraphicsServices`_PurpleEventCallback + 590 frame #35: 0x373651d2 GraphicsServices`PurpleEventCallback + 34 frame #36: 0x33829172 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 34 frame #37: 0x33829116 CoreFoundation`__CFRunLoopDoSource1 + 138 frame #38: 0x33827f98 CoreFoundation`__CFRunLoopRun + 1384 frame #39: 0x3379aebc CoreFoundation`CFRunLoopRunSpecific + 356 frame #40: 0x3379ad48 CoreFoundation`CFRunLoopRunInMode + 104 frame #41: 0x373642ea GraphicsServices`GSEventRunModal + 74 frame #42: 0x356b0300 UIKit`UIApplicationMain + 1120 frame #43: 0x000a297c Capture`main(argc=1, argv=0x2fd60cfc) + 116 at main.m:16 frame #44: 0x3bb2bb20 libdyld.dylib`start + 4 

Вы заметите, что кадр 25 является единственным вызовом, который делает мой код, и это выглядит как cancelButtonTouched .

 - (IBAction)cancelButtonTouched:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; } 

Я в недоумении относительно того, что происходит, у меня никогда не было такой проблемы раньше, основываясь на системных вызовах, кажется, это проблема автоматического макета. Я проверил, что viewWillApper вызывается на представлении контроллера представления до возникновения сбоя, поэтому я предполагаю, что это выдача во время компоновки представления представления.

Любые идеи о том, как сузить эту проблему до определенного соответствия? Или любые другие идеи?

Это воспроизводится на некоторых устройствах, где, как и на других, редко бывает когда-либо. Так что это прерывисто.

Обновить

Снимок экрана точки останова.

введите описание изображения здесь

Обновление 2

Таким образом, это определенно проблема с увольнением в presentingViewController , увольнение двух уровней в глубину ( [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil] ) отлично работает, но, очевидно, не желаемый результат, я хочу вернуться только на 1 уровень. Это еще больше заставляет меня думать, что существует проблема «переустановки взгляда».

4 Solutions collect form web for “Странный сбой при отклонении диспетчера просмотров, авто-макета виноват?”

Основываясь на идее Карла Линдберга, я подготовил и использовал следующую категорию iOS, и у меня больше нет сбоев:

UIView + AddSubviewWithRemovingFromParent.h

 #import <UIKit/UIKit.h> @interface UIView (AddSubviewWithRemovingFromParent) - (void)addSubviewWithRemovingFromParent:(UIView *)view; @end 

UIView + AddSubviewWithRemovingFromParent.m

 #import "UIView+AddSubviewWithRemovingFromParent.h" @implementation UIView (AddSubviewWithRemovingFromParent) - (void)addSubviewWithRemovingFromParent:(UIView *)view { if (view.superview != nil) { [view removeFromSuperview]; } [self addSubview:view]; } @end 

теперь вы можете использовать метод addSubviewWithRemovingFromParent для добавления subView вместо метода addSubview следующим образом:

 UITableViewCell *cell = [[UITableViewCell alloc] init]; [cell.contentView addSubviewWithRemovingFromParent:<viewToAdd>]; 

Подвести итог:

  1. найти все ссылки addSubView в ваших контроллерах, где приложение рушится
  2. импортировать категорию UIView + AddSubviewWithRemovingFromParent.h
  3. использовать метод addSubviewWithRemovingFromParent вместо addSubView

Кажется, я помню что-то вроде этого, хотя не уверен, что это было то же самое. В моем случае это вызвано вызовом addSubview: (или insertSubview: …) с представлением, которое уже было подвью. Хотя обычно я думаю, что UIView имеет дело с этим, с автоматическим компоновкой кажется, что некоторая связанная информация может быть добавлена ​​в другое место дважды, и при попытке очистить эту связанную информацию может произойти сбой. В моем случае решение заключалось в том, чтобы я только добавил subviews один раз, и этот сбой (или мой похожий в любом случае) ушел.

В моем случае этот сбой произошел, когда у меня был контроллер вида в раскадровке, но загрузил содержимое представления из NIB с тем же контроллером представления, что и владелец файла. Это нормально работает нормально, но у меня была view установленная как в раскадровке, так и в NIB, что вызвало ошибку iOS6 «добавить subview two». Очищая выходное отверстие в NIB, все было исправлено.

У меня была такая же проблема.
Такая же проблема возникает для меня, когда я представляю два контроллера представления по образцу друг над другом и хочу вернуться к первому. Отключение автозапуска для первого представленного представления только решает проблему для меня.
В вашем случае self.presentingviewcontroller
К сожалению, я не смог сузить его дальше.

  • UIScrollView в раскадровке не работает с классами класса IOS 8 и автозапуском
  • Ошибка UICollectionView в в iOS9 - Xcode7
  • Копировать IB Созданы ограничения на другой UIView
  • iOS 11 безопасных областей против анимации UIView
  • Равномерно разворачивайте кнопки горизонтально по экрану, используя автозапуск. Неравномерное расстояние между ними
  • Альтернатива методам автоопределения UIView, которые должны быть устаревшими
  • «Автоматическая компоновка по-прежнему требуется после выполнения -layoutSubviews» в подклассе UINavigationBar
  • Установка UICollectionViewCellSize во время выполнения
  • Как сделать autoViewCell автоматически размером по высоте?
  • UILabel добавляет излишнюю верхнюю и нижнюю прокладку при вертикальном и разрыве линий
  • Как AutoLayout кнопки в контроллере uiview в iphone?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.