2013-03-26 12 views
8

私は非常に奇妙なクラッシュを経験しています、ここではバックトレースです。あなたは、フレーム25に気づくでしょうView Controllerを無効にするときに奇妙なクラッシュが発生する、

* 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 

は私のコードが行う呼び出しであり、それは次のようになりますcancelButtonTouchedです。私は何が起こっているかのように途方に暮れています

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

は、私がシステムに基づいて前に、このような問題は、自動レイアウトの問題のように見える呼び出していたことがありません。クラッシュが発生する前にviewWillApperがプレゼンテーションビューコントローラで呼び出されていることを確認しました。したがって、プレゼンテーションビューのレイアウト中に発行されていると想定しています。

この問題を特定のレイアウト制約に絞り込む方法に関するアイデアはありますか?または他のアイデア?

これは一部のデバイスで再生可能です。他のデバイスと同じように再生されることはめったにありません。それは断続的です。ブレークポイントの

更新

スクリーンショット。

enter image description here

アップデート2

だから、それは間違いpresentingViewControllerに解雇の問題である、([self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil])深い二つのレベルを却下することは望ましい結果正常に動作しますが、明らかではない、私はしたいです1レベル戻ってください。これはさらに、私がそこに「再敷設」の問題があると信じさせる。

+0

Objective-C例外にブレークポイントがありますか?もしそうなら、このコードがヒットした後も実行を続けるとどうなりますか? Autolayoutは制約を破ると例外をスローしますが、例外がスローされるまで実際のエラーは記録されません。 – frozendevil

+0

私はそうですが、ブレークポイントをオンにしてもしなくても同じポイントで停止します。継続は何もしません、ちょうど同じ場所にヒットし続けます。それが壊れている場所のスクリーンショットを添付し、スタックはテキストに掲載されたものと同じです。 –

+0

また、不要な制約などに関する通常の自動レイアウトデバッグメッセージが表示されません。 –

答えて

4

カール・リンドバーグの考え方に基づいて、私が作成し、使用する次のiOSカテゴリを、私はもう何のクラッシュを持っていない:

のUIView + AddSubviewWithRemovingFromParent.h

#import <UIKit/UIKit.h> 

@interface UIView (AddSubviewWithRemovingFromParent) 

- (void)addSubviewWithRemovingFromParent:(UIView *)view; 

@end 

のUIView + AddSubviewWithRemovingFromParent。メートル

#import "UIView+AddSubviewWithRemovingFromParent.h" 

@implementation UIView (AddSubviewWithRemovingFromParent) 

- (void)addSubviewWithRemovingFromParent:(UIView *)view { 
    if (view.superview != nil) { 
     [view removeFromSuperview]; 
    } 
    [self addSubview:view]; 
} 

@end 

今、あなたはこのように代わりにaddSubviewメソッドのサブビューを追加するaddSubviewWithRemovingFromParentメソッドを使用することができます。それを要約すると

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

  1. は中addSubViewのすべての参照を見つけますあなたのコントローラ がクラッシュしているコントローラ
  2. カテゴリをインポートするUIView + AddSubviewWithRemovingF romParent.h
  3. 利用法addSubviewWithRemovingFromParent代わりにaddSubView
  4. 私はストーリーボードのビューコントローラを持っていたが、ファイルと同じビューコントローラでNIBからのビューの内容をロードしたときに、このクラッシュが起こった私の場合は
+0

おそらくビューが表示されているかどうかを確認できます。 superview == self、そうであれば、削除してから再追加するのではなく、[self bringSubviewToFront:view]を呼び出すだけです。同じ結果とより効率的でなければなりません。サブビューを追加/削除すると、あなたが望むかもしれないし、望まないかもしれない他のものがたくさんトリガされます。 –

+0

こんにちは、私の場合は、削除して再度追加する必要がありました。問題は、 'reloadDataTable'がより多く呼び出されたため、UITableViewCellがより多くインスタンス化されたことです。したがって、サブビューは1つのビューに追加されました(それには2つの親があります)。 iOS 7システムは、元の親であるiOS 6からビューを削除することができませんでした。あなたは今言うことができます、あなたは複数の親に1つのビューを追加すべきではありません。はい、私は同意します、それは行く方法ですが、システムはこの能力( "複数の親"の状況を扱う)を持っていなければならないと思います。 – ljboy

+0

現在、別のビュー階層の一部であるサブビューを追加する場合は、そのビューから自動的に移動する必要があります。 iOS6の自動レイアウトで、その部分がきれいに処理されなかった可能性があります。あなたの場合、はい、自分自身に追加する前に、現在のスーパービューから削除する必要があります。しかし、現在のスーパービューが既に自分である場合は、削除してから再追加する必要はありません。これは、おそらくあなたのコードでチェックするのに十分な共通点です。しかし、iOS7がこれを処理していることが分かりました(私はそう思われました)ので、上記のコードはiOS6上でのみ必要な場合があります。ありがとうございました。 –

7

私はこのようなことを覚えているようですが、まったく同じことは分かりませんが。私の場合は、既にサブビューだったビューをaddSubview:(またはinsertSubview:...)呼び出すことによって発生しました。通常、私はUIViewがそれを扱うと思いますが、自動レイアウトでは、関連付けられた情報を別の場所に2回追加することが可能で、その関連情報を消去しようとするとクラッシュする可能性があります。私の場合、解決策はサブビューを1回追加することでしたが、このクラッシュ(またはそれに類似したもの)はなくなりました。

+0

驚くばかり - それは私のためにもそれだった。 [view removeFromSuperView]の簡単な呼び出しでソートされました。ありがとう@carl :-) – Matthew

0

私は同じ問題を抱えていました。
同じ問題が発生します。私は、2つのビューコントローラをモーダル上に重ねて表示し、最初のビューコントローラに戻したいと思っています。 最初に表示されたの自動レイアウトを無効にすると、は私の問題を解決します。
あなたの場合self.presentingviewcontroller
残念ながら私はそれをさらに絞り込むことができませんでした。

+0

ストーリーボードを使用していないような気がしますか?ストーリーボードを使用する場合、ストーリーボード内のすべてのシーン/ビューが自動レイアウトであるかどうかわからないからです.Xcode 5のオートレイアウト機能強化により、真の問題が明らかになります。 –

1

オーナー。これは正常に動作しますが、ストーリーボードとNIBの両方にviewコンセントが設定されていました.iOS6の「サブビューを2回追加する」バグが発生しました。 NIBのビューアウトレットをクリアすると、すべてが修正されました。

関連する問題