no se pudo generar el locking newParagraphStyle

Tengo varios lockings apareciendo en mis informes que informan la siguiente razón:

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

La aplicación en la que esto está sucediendo establece una gran cantidad de text atribuido mediante progtwigción (fonts, colors, a veces styles de párrafo), pero no puedo encontrar ningún patrón directamente relacionado con esto. Lo que sí veo es que casi todos los informes incluyen una reference en la traza de la stack a alguna forma de setLineBreakMode:

 -[_UICascadingTextStorage(Accessors) setLineBreakMode:] 

Nunca he sido capaz de volver a crear esto por mi count, pero aparece de forma bastante regular en mis informes de fallos. No estoy configurando específicamente el modo de salto de línea en ninguno de estos lugares. ¿Algunas ideas?

EDIT: Pasé más time mirando esto y pude encontrar un patrón para reproducir. Así que tengo un UITextField, y cuando presionas regresar en el keyboard, se detecta el carácter "/ n" y el campo de text renuncia al primer estado de respuesta. Si en algún momento después de eso, intenta modificar el text (o el text atribuido) del campo, se bloquea. Hay un elemento key, solo sucede si tiene typingAttributes configurado. No importa en qué estén configurados.

Intenté todo, estableciendo typingAttributes to nil antes de configurar el text, estableciendo una cadena fija para asegurarme de que no era a lo que lo estábamos configurando, sin suerte. Sigue fallando. Parece que una vez que te encuentras en este estado, el campo de text simplemente está roto. Un truco para evitarlo es volar el campo de text y crear uno nuevo, pero es solo eso. Un truco

Alguna información más interesante, la forma en que el código detecta la key de retorno no estaba bien escrita; detectó el "/ n" y devolvió NO en:

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

No utilizó el método apropiado:

 - (BOOL)textFieldShouldReturn:(UITextField *)textField 

En un lugar de la aplicación, esto realmente solucionó el locking, en otros lugares siempre estaba usando el método correcto y el locking sigue sucediendo. El único trabajo es eliminar el campo de text y crear uno nuevo. Para mí, esto parece un error en el propio iOS.

Tuve este problema justo ahora y pude solucionarlo estableciendo los typingAttributes del textField problemático en nil directamente antes de que resignFirstResponder sea ​​invocado por ese mismo textField .

La solución de Frankie ayudó, pero aún se encontraron casos extremos que desencadenaron este error:

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

Mi solución fue subclass UITextField y agregar una propiedad hackTextAttributes:

 import UIKit class HackTF: UITextField { var hackTextAttributes: [String: AnyObject] init(frame: CGRect, textAttributes: [String: AnyObject]) { hackTextAttributes = textAttributes super.init(frame: frame) delegate = self } requinetworking 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 } }