2015-09-15 8 views
5

ORIGINAL POSTtableView.dequeueReusableCellWithIdentifierは()我々は最近スウィフト2.0、およびiOS9に我々のアプリを変換したアプリが

がハングアップする原因となります。私が見ている1つの奇妙な問題は、tableView.dequeueReusableCellWithIdentifier()を呼び出すと、アプリケーションがシミュレータにハングアップするということです。


コード100%

CPU Pegging


func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    //hangs on the line below 
    let headersection: HeaderSectionCell = tableView.dequeueReusableCellWithIdentifier("SectionHeader") as! HeaderSectionCell 

    ... 

    return headersection 
} 

ヘッダセル

class HeaderSectionCell: UITableViewCell { 

    @IBOutlet var labelOne: UITextView! 
    @IBOutlet var labelTwo: UITextView! 
    @IBOutlet var textView: UITextView! 

} 

シミュレータCPU使用ペグ3210 Xcodeで一時停止した後、このSwift機能で停止しています。ここで

Pausing while hanging shows us here


のiOSは、カバーの下にループしているルーチンの一部です。

enter image description here

enter image description here

最後に、dequeueReusableCellWithIdentifierに私たちのスウィフトの呼び出し() enter image description here

は、この特定の吊りインスタンスが機能tableView(tableView: UITableView, viewForHeaderInSection section: Int)からですが、我々はまたの呼び出しの内側にぶら下がっていますtableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)、同じ問題があります。

私はストーリーボードエディタでセルのプロパティを使って遊んでみましたが、うまく動作している他のビューとは異なるものはありません。

EDIT

財団とlibobjc.A.dylib間の無限ループがdequeReusableCellWithIdentifier()への呼び出しの下に、存在すると思われます。私はFoundationが他のフレームワークの前にインポートされていることを確認し、問題のUITableViewCellを独自のクラスに抽象化しました(再利用されました)。問題の元の呼び出しは現在機能していますが、私が把握しようとしているSwiftカバーの下でループしている別の呼び出しがあります。無限ループで一時停止を押す

は、同じアセンブリのスタックの場所に私を置く:一時停止後のスタックトレースの

トップ:別の一時停止後のスタックトレースの

libobjc.A.dylib`objc_msgSend: 
    0x107f6a800 <+0>: testq %rdi, %rdi 
    0x107f6a803 <+3>: jle 0x107f6a850    ; <+80> 
    0x107f6a805 <+5>: movq (%rdi), %r11 
    0x107f6a808 <+8>: movq %rsi, %r10 
    0x107f6a80b <+11>: andl 0x18(%r11), %r10d 
    0x107f6a80f <+15>: shlq $0x4, %r10 
    0x107f6a813 <+19>: addq 0x10(%r11), %r10 
    0x107f6a817 <+23>: cmpq (%r10), %rsi 
    0x107f6a81a <+26>: jne 0x107f6a820    ; <+32> 
-> 0x107f6a81c <+28>: jmpq *0x8(%r10) 

トップ:

Foundation`-[NSLocalizableString length]: 
    0x1071c5cbc <+0>: pushq %rbp 
    0x1071c5cbd <+1>: movq %rsp, %rbp 
-> 0x1071c5cc0 <+4>: movq 0x80461(%rip), %rax  ; NSLocalizableString._developmentLanguageString 
    0x1071c5cc7 <+11>: movq (%rdi,%rax), %rdi 
    0x1071c5ccb <+15>: movq 0x7436e(%rip), %rsi  ; "length" 
    0x1071c5cd2 <+22>: popq %rbp 
    0x1071c5cd3 <+23>: jmpq *0x8ea77(%rip)   ; (void *)0x0000000107f6a800: objc_msgSend 

これら2つの下位レベルのルーチンの間を行き来するだけで、シミュレータCPUの100%を消費します。あなたはまた、正しくないviewForHeaderInSectionのセルをロードしようとしているdequeueReusableHeaderFooterViewWithIdentifier代わりdequeueReusableCellWithIdentifier

答えて

13

としてあなたHeaderSectionViewを登録することを忘れないでください。 UITextViewCellには、UITextViewのローカリゼーションプロパティで英語がチェックされていないTextプロパティの値が空でないUITextFieldが含まれていました。

チェックすると、Englishが問題を解決しました。

どのような痛みです! Go to figure、なぜ分かりにくいエラーを投げるのではなく、無限ループするのはなぜですか?

+2

なぜ私は再利用可能なセルをデキューできなかったのか理解しようとしたが、私は窓から飛び降りるほどだった。それから、私はあなたのポストにつまずいた。私は自分自身に "これが問題/修正となる方法はありません"と考えました - 低く、問題を修正しました。おそらく私はリリースノートでこれを逃したでしょう。「ローカリゼーションを選択しなければ、無限ループに入るでしょうが、私たちはあなたに言いません」ありがとうございました! – fischgeek

0

使用。

編集:

class HeaderSectionView: UITableViewHeaderFooterView { 

@IBOutlet var labelOne: UITextView! 
@IBOutlet var labelTwo: UITextView! 
@IBOutlet var textView: UITextView! 

} 

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    //hangs on the line below 
    let headersection: HeaderSectionView = tableView.dequeueReusableHeaderFooterViewWithIdentifier("SectionHeader") as! HeaderSectionView 

    ... 

    return headersection 
} 

は、それは文字列のローカライズの問題でした

tableView.registerNib(UINib(nibName: "HeaderSectionView", bundle:nil), forHeaderFooterViewReuseIdentifier: "SectionHeader") 
+0

これは、 'キャスト' UITableViewHeaderFooterViewですか?無関係なタイプの 'HeaderSectionCell'には常に失敗します。 – styler1972

+0

セクションヘッダービュー(HeaderSectionCell)はどこに登録していますか?コードを表示できますか? – Shoaib

+0

私はUITableViewHeaderFooterに変換すると、実行時例外が発生します。私はストーリーボードを使用しているので、明示的に登録する必要はありません。しかし、これは、アプリケーションの他の場所で動作しているので、変換が適切な動作のコースであることを確認していません – styler1972

5

私の解決策は、styler1972'sに似ていました。

私の場合は、Swift 1.2からSwift 2.0にSwift/Objective-Cプロジェクトの組み合わせをアップグレードしていました。このアプリは、Swift 2.0にアップグレードする前に、iOS 9で正常に動作しました。 Swift 2.0にアップグレードした後、アプリケーションはテーブルビューのセルアクセサリプッシュからビューコントローラにセグメンテーションする際に無限ループに入ります。シミュレータでアプリを実行し、無限ループでキャッチされたときに一時停止すると[NSLocalizableString length]になりました(これが私をこのポストに導きました)。

私の修正は以下のとおりです。

  • en.lprojディレクトリからMain.storyboardファイルを削除します。
  • InfoPlist.stringsファイルを含むen.lprojディレクトリを削除します。
  • Main.storyboardをルートプロジェクトディレクトリに配置します。
  • 上記の変更を反映するようにプロジェクトを更新します。
  • プロジェクト/ Info/Localizationの設定で、すべての設定を削除します。
  • ビルドディレクトリをきれいにしてください。
  • ビルドをクリーンアップします(適切な対策のため)。
  • ビルドして実行します。

無限ループはもう発生しません。

+0

正確に!これらの変換スクリプトは、appleの*ほとんど*無視されたものの一つです。 – styler1972

+0

なぜ、 "dequeueReusableCellWithIdentifier"が1つのテーブルビューで壊れていて、別のテーブルビューで壊れていたのか疑問に思って2時間過ごしました。このヒントをお寄せいただき、ありがとうございました。 –

+0

上記の手順は私にとっても役に立ちました。良い悲しみ、私はこの一日半を無駄にした!私は本当に情報を感謝します。私自身はこれを見つけられませんでした。 –

3

ローカリゼーションファイルを後で復元するために、プロジェクトファイルをバックアップしてください。

  • プロジェクト設定、ローカリゼーションでは、プロジェクト開発言語以外のすべてのローカリゼーションを削除します(これは英語です)。
  • 清潔にして実行します。この時点でもうエラーは表示されません。
  • 上記で削除したローカライズを追加し、バックアップからローカライズを復元します。