2015-09-15 16 views
5

ORIGINAL POSTtableView.dequeueReusableCellWithIdentifier() powoduje, że aplikacja do powieszenia

Niedawno konwertowane naszą aplikację Swift 2.0 oraz iOS9. Jeden dziwny problem, który widzę, to to, że wywołania tableView.dequeueReusableCellWithIdentifier() powodują zawieszenie się aplikacji w symulatorze.


Kod

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

    ... 

    return headersection 
} 

nagłówka kołki użycia komórek

class HeaderSectionCell: UITableViewCell { 

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

} 

Symulator procesora przy 100%

CPU Pegging


Po naciśnięciu pauzy w Xcode, pokazuje mi, że jest zawieszone na tej funkcji Swift.

Pausing while hanging shows us here


Oto niektóre z procedur gdzie iOS typami pętli pod kołdrą.

enter image description here

enter image description here

Wreszcie nasz Swift wywołanie dequeueReusableCellWithIdentifier() enter image description here

tym konkretnym przypadku jest wiszące z funkcji tableView(tableView: UITableView, viewForHeaderInSection section: Int), ale jesteśmy również wiszące wewnątrz wywołania tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath), z tym samym problemem.

Próbowałem odtwarzać właściwości komórek w edytorze scenorysów, ale nic nie wystaje z niczego innego niż inne widoki, które działają poprawnie.

EDIT

Wydaje się, że istnieje nieskończona pętli pomiędzy Fundacji libobjc.A.dylib, pod tym wywołaniu dequeReusableCellWithIdentifier(). W efekcie upewniłem się, że Fundacja została zaimportowana przed jakimkolwiek innym środowiskiem, i wyrzuciłem szkodliwą UITableViewCell do jej własnej klasy (była ponownie używana). Oryginalne wezwanie działa, ale jest jeszcze jeden, który wciąż jest w pętli pod okładkami Swift, nad którymi pracuję.

Uderzanie przerwa w nieskończonej pętli stawia mnie w tych samych miejscach stosu montaż:

Góra ślad stosu po pauzie:

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) 

Top śladu stosu po innej pauzie:

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 

To tylko pętla tam iz powrotem pomiędzy tymi dwiema procedurami niższego poziomu, zużywając 100% procesora symulatora.

Odpowiedz

13

to był problem lokalizacja String. UITableViewCell zawierała UITextField z niepustą wartością dla właściwości Text, która nie miała angielskiego zaznaczonego we właściwościach lokalizacyjnych UITextView.

Sprawdzenie, czy problem został rozwiązany przez English.

Co za ból! Idź, dlaczego nie powinieneś pętać zamiast rzucać zrozumiałego błędu?

+2

Po wielu godzinach próbowania wyjaśnienia, dlaczego nie mogłem zdezynfekować celi wielokrotnego użytku, byłem tak blisko wyskakiwania przez okno. Potem natknąłem się na twój post. Pomyślałem sobie, że "nie ma mowy, żeby to problem/naprawa" - niska i oto poprawiono problem. Może przegapiłem to w uwagach do wydania: "Jeśli nie wybierzesz lokalizacji, wprowadzisz nieskończoną pętlę, ale nie powiemy ci". DZIĘKUJĘ CI! – fischgeek

0

użycie dequeueReusableHeaderFooterViewWithIdentifier zamiast dequeueReusableCellWithIdentifier

Próbujesz załadować komórkę viewForHeaderInSection który również nie jest poprawne.

Zmieniano:

class HeaderSectionView: UITableViewHeaderFooterView { 

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

} 

i

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

    ... 

    return headersection 
} 

Nie zapomnij zarejestrować HeaderSectionView jak

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

To daje: "Przesłać z" UITableViewHeaderFooterView? " do niepowiązanego typu "HeaderSectionCell" zawsze zawodzi. " – styler1972

+0

Gdzie rejestrujesz nagłówek sekcji Widok (HeaderSectionCell)? czy możesz pokazać kod? – Shoaib

+0

Po przekonwertowaniu na obiekt UITableViewHeaderFooter otrzymuję wyjątek środowiska wykonawczego. Używam storyboardu, więc nie muszę się jawnie rejestrować. Jednak działa to w innych miejscach w aplikacji, więc nie jestem pewien, czy konwersja jest właściwym działaniem. – styler1972

5

Moje rozwiązanie było podobne do stylizera1972.

W moim przypadku uaktualniłem połączenie projektu Swift/Objective-C od Swift 1.2 do Swift 2.0. Aplikacja działała poprawnie na iOS 9 przed aktualizacją do Swift 2.0. Po uaktualnieniu do Swift 2.0 aplikacja wchodzi w nieskończoną pętlę, kiedy przenosi się z widoku z komórki widoku tabeli do kontrolera widoku. Uruchomienie aplikacji w symulatorze, a następnie wstrzymanie jej po złapaniu w nieskończoną pętlę pozostawiło mnie na [NSLocalizableString length] (która doprowadziła mnie do tego postu).

Moja poprawka polegała na wykonaniu następujących czynności.

  • Usuń plik Main.storyboard z katalogu en.lproj.
  • Usuń katalog en.lproj, w tym plik InfoPlist.strings.
  • Umieść Main.storyboard w głównym katalogu projektu.
  • Zaktualizuj projekt, aby odzwierciedlić powyższe zmiany.
  • W ustawieniach projektu w obszarze Informacje/lokalizacja usuń wszystkie ustawienia.
  • Wyczyść katalog kompilacji (dla dokładnej miary).
  • Wyczyść kompilację (na dokładkę).
  • Buduj i biegnij.

Nieskończona pętla już nie występuje.

+0

DOKŁADNIE! te skrypty konwersji są jedną z najbardziej zaniedbanych rzeczy w Apple. – styler1972

+0

Po prostu spędził 2 godziny zastanawiając się, dlaczego "dequeueReusableCellWithIdentifier" został złamany na 1 widoku tabeli, ale nie inny. Dzięki za tę wskazówkę, pracowałeś dla mnie, aby zmienić ustawienia lokalizacji w tym serwisie fabularnym. –

+0

Te kroki powyżej również działały dla mnie. Dobry Boże, zmarnowałem cały dzień i pół tego! Naprawdę doceniam informacje. Nie ma mowy, bym znalazł to na własną rękę. –

3

Należy wykonać kopię zapasową plików projektu, aby później przywrócić pliki lokalizacji.

  • W Ustawieniach projektu, Lokalizacjach usuń wszystkie lokalizacje z wyjątkiem języka programowania projektu (który był dla mnie angielski).
  • Oczyść i uciekaj. W tym momencie nie powinieneś już widzieć błędu.
  • Dodaj lokalizacje usunięte powyżej i przywróć lokalizację z kopii zapasowej.
Powiązane problemy