带有换行符的NSTextField字符串

时间:2016-01-26 13:43:04

标签: swift nstextfield

我有一系列带有可选“注释”字段的对象,其中包含一个字符串。我想提取所有注释并将它们列为NSTextField(或任何其他合适的视图)中的单独行。所以我这样做了......

@IBOutlet var CommentsTextView: NSTextView!

func CommentsInitialize() {
    var cmt = ""
    for c in document!.commentCards {
        cmt += c.info["comment"] ?? "" + "\n"
    }
    CommentsTextView.string = cmt
}

显示文字,但所有一行都在一起运行。根据{{​​3}},它应该可以工作,但新行只是没有做任何事情(我试过\ n,\ r \ n和\ r)。我错过了一些明显的东西吗我可以在IB中看到TextStorage中有换行模式的设置,但我似乎无法设置它,更改值什么都不做。

P.S。如果你想知道失踪的“弱者”,显然这是一个古老的可可问题 - 那里的弱者释放并死亡

1 个答案:

答案 0 :(得分:2)

问题是nil合并运算符??的优先级(131)低于+运算符(140),因此行:

cmt += c.info["comment"] ?? "" + "\n"

将被评估为

cmt += c.info["comment"] ?? ("" + "\n")

随后,仅当"\n"包含nil时,换行符cmt才会添加到c.info["comment"]

如果用以下

替换该行
cmt += (c.info["comment"] ?? "") + "\n"                  // (+)

然后,对于c.info["comment"]非零的情况,也会添加换行符。

现在,上面的固定过程(+)还会为空("")以及零值注释字段添加换行符,并且还会在最后一个注释字段内容之后添加最后一个换行符。如果您只想为实际现有注释添加换行符(不是nil也不是空),您可以使用if let可选绑定而不是nil合并运算符:

if let str = c.info["comment"] where str.characters.count > 0 {
    cmt += str + "\n"
}

/* remove last trailing '\n' */
cmt.removeAtIndex(cmt.endIndex.advancedBy(-1))