无法生成newParagraphStyle崩溃

时间:2014-12-16 15:10:37

标签: ios iphone nsattributedstring

我的报告中出现了各种崩溃,报告了以下原因:

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

发生这种情况的应用确实以编程方式设置了很多属性文本(字体,颜色,有时是段落样式),但我找不到与此直接相关的任何模式。我所看到的几乎所有的报告都包含了堆栈跟踪中某些形式的setLineBreakMode的引用:

-[_UICascadingTextStorage(Accessors) setLineBreakMode:] 

我自己从来没有能够重新创建它,但它确实在我的崩溃报告中定期出现。我没有专门在这些地方设置换行模式。有什么想法吗?

编辑: 我花了更多的时间研究这个并且能够找到一种模式来重现。所以我有一个UITextField,当你点击键盘上的返回时,检测到“/ n”字符,文本字段将重新启动其第一个响应者状态。如果在此之后的任何时候,您尝试修改该字段的文本(或属性文本),它会崩溃。有一个关键元素,只有在设置了typingAttributes时才会发生。它们的设定并不重要。

我尝试了一切,在设置文本之前将typingAttributes设置为nil,设置一个固定的字符串以确保它不是我们设置的 - 没有运气。总是崩溃。一旦你进入这种状态,文本字段就会被打破。避免它的黑客就是吹走文本域并创建一个新文本 - 但就是这样。一个黑客。

一些更有趣的信息,代码检测返回键的方式写得不好 - 它检测到“/ n”并返回NO:

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

它没有使用适当的方法:

- (BOOL)textFieldShouldReturn:(UITextField *)textField

在应用程序的一个地方,这实际上修复了崩溃,在其他地方,它总是使用正确的方法,崩溃仍在发生。唯一的解决方法是吹走文本域并创建一个新文本域。对我来说,这似乎是iOS本身的一个错误。

4 个答案:

答案 0 :(得分:1)

我刚才遇到了这个问题,并且可以通过在typingAttributestextField调用nil之前将问题resignFirstResponder设置为textField来解决此问题。 {1}}。

答案 1 :(得分:1)

Frankie的解决方案有所帮助,但仍然发现触发此错误的边缘情况:

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
  }
}

我的解决方案是继承UITextField并添加hackTextAttributes属性:

Mysqldump -u username -p password Database name > filename.sql;

答案 2 :(得分:0)

也许这会帮助某人。受mcm's solution的启发,我能够通过一个简单的文本字段子类来解决崩溃问题。

class VLAttributedTextField: UITextField {
    override func resignFirstResponder() -> Bool {
        self.typingAttributes = self.defaultTextAttributes
        let resign = super.resignFirstResponder()

        return resign
    }
}

如上所述,将typeingAttributes设置为nil(或空字典)无效。

答案 3 :(得分:0)

在文本字段上设置打字属性仅仅是故事的一半。 如果您在UITextField上设置了一个委托,则也请使其无效。 我需要两个都可以使此崩溃消失。