2014-12-16 9 views
5

mam różne awarie pojawiają się w raportach, które są raportowania z następującego powodu:udało się wygenerować newParagraphStyle katastrofę

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'failed to generate newParagraphStyle' 

Aplikacja, że ​​to dzieje się na nie ustawić wiele nadana tekstu programowo (czcionki, kolory , czasami style akapitowe), ale nie mogę znaleźć żadnego wzoru bezpośrednio z tym związanego. Co ja widzę to prawie wszystkie raporty zawierają odniesienie w ślad stosu do jakiejś formy setLineBreakMode:

-[_UICascadingTextStorage(Accessors) setLineBreakMode:] 

Nigdy nie byłem w stanie odtworzyć ten sam, ale nie pojawiają się w dość regularnie w raportowaniu awarii. Nie ustalam konkretnie trybu podziału linii w żadnym z tych miejsc. Jakieś pomysły?

EDYCJA: Spędziłem więcej czasu, patrząc na to i udało mi się znaleźć wzór do odtworzenia. Tak więc mam UITextField, a kiedy naciśniesz return na klawiaturze, zostanie wykryty znak "/ n", a pole tekstowe zrezygnuje z pierwszego statusu respondenta. Jeśli w którymś momencie później spróbujesz zmodyfikować tekst (lub przypisany tekst) pola, ulegnie awarii. Jest jeden kluczowy element, zdarza się to tylko wtedy, gdy masz ustawione opcje typowania. Nie ma znaczenia, do czego są ustawione.

Próbowałem wszystkiego, ustawiając typingAttributes na zero przed ustawianiem tekstu, ustawianie stałego łańcucha, aby upewnić się, że nie było to, do czego je ustawiliśmy - bez powodzenia. Nieustannie się zawiesza. Wygląda na to, że kiedy wejdziesz w ten stan, pole tekstowe jest po prostu zepsute. Hackem, aby tego uniknąć, jest zdmuchnięcie pola tekstowego i stworzenie nowego - ale to po prostu. Hack.

Niektóre bardziej interesujące informacje, tak że kod wykrywa klawisz Enter nie był dobrze napisany - wykryto go „/ n” i nie przyniosło w:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 

Nie należy zastosować odpowiednią metodę:

- (BOOL)textFieldShouldReturn:(UITextField *)textField 

w jednym miejscu w aplikacji to rzeczywiście stała katastrofę, w innych miejscach to było zawsze przy użyciu odpowiedniej metody i katastrofy wciąż dzieje. Jedyna praca wokół to zdmuchnięcie pola tekstowego i utworzenie nowego. Dla mnie wygląda to jak błąd w samym systemie iOS.

+0

Ja też dostałem katastrofy ... oczyść projekt i ponownie przebuduj. Naprawiono. Nie wiem o co chodzi –

Odpowiedz

1

miałem ten problem właśnie teraz i był w stanie go naprawić poprzez ustawienie typingAttributes z problematycznych textField do nil bezpośrednio przed resignFirstResponder jest wywoływana przez tego samego textField. Rozwiązanie

0

Frankiego pomógł, ale jeszcze znaleźć przypadki krawędzi, które spowodowały ten błąd:

** Assertion failure in -[_UICascadingTextStorage setLineBreakMode:], 
/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.30.14/TextSystem/_UICascadingTextStorage.m:292 

Moje rozwiązanie było podklasę UITextField i dodać obiekt hackTextAttributes:

import UIKit 

class HackTF: UITextField { 
    var hackTextAttributes: [String: AnyObject] 

    init(frame: CGRect, textAttributes: [String: AnyObject]) { 
    hackTextAttributes = textAttributes 
    super.init(frame: frame) 
    delegate = self 
    } 

    required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
    } 

    func hackSetText(text: String) { 
    attributedText = NSAttributedString(string: text, attributes: hackTextAttributes) 
    } 

    func hackSetAttributedText(text: String, attributes: [String: AnyObject]) { 
    hackTextAttributes = attributes 
    hackSetText(text) 
    } 
} 

extension HackTF: UITextFieldDelegate { 
func textFieldDidBeginEditing(textField: UITextField) { 
    typingAttributes = hackTextAttributes // Make sure fields with no text have appropriate typingAttributes 
    } 
} 

// MARK: Apple Crash Prevention Hack 
extension HackTF { 
    override func resignFirstResponder() -> Bool { 
    var isResigningHack = false 
    if self.text?.length == 0 { // if no text, add some text so we won't crash... 
     isResigningHack = true 
     attributedText = NSAttributedString(string: " ", attributes: hackTextAttributes) 
    } 

    typingAttributes = nil 
    let resign = super.resignFirstResponder() 

    if isResigningHack { // clear the text 
     attributedText = NSAttributedString(string: "", attributes: hackTextAttributes) 
    } 

    return resign 
    } 
}