如何在一个文本字段中将标记的文本显示为Xcode,swift 2中其他文本字段中的标记文本

时间:2015-08-31 21:40:40

标签: xcode macos swift

我的OS X程序中有两个文本字段有两个文本。我想有以下效果。当我在一个文本字段中标记部分文本时,我希望在其他文本字段中具有相同标记的文本部分。如何在xcode和swift 2中实现它?

1 个答案:

答案 0 :(得分:2)

您可以创建两个TextView(注意:类NSTextView而不是NSTextField)并使用outlet将它们连接到视图控制器。再次,连接最里面的TextView,而不是剪辑视图或带边框的滚动视图。在下面的示例中" searchView"是包含您选择的文本的那个," textView"包含您要突出显示的文本的那个。

然后,你可以做这样的事情(注意我在Swift 1.2中测试过这个)

class ViewController: NSViewController {


    @IBOutlet var textView: NSTextView!
    @IBOutlet var searchView: NSTextView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
       NSNotificationCenter.defaultCenter().addObserver(self, selector: "selectedSomeText:", name: NSTextViewDidChangeSelectionNotification, object: searchView)
    }

    @objc func selectedSomeText(notification: NSNotification) {
        let selectedRange = searchView.selectedRange()
        if selectedRange.length > 0 {
            let nsString = searchView.string! as NSString
            let selectedString = nsString.substringWithRange(selectedRange)
            let regex = NSRegularExpression(pattern: selectedString, options: nil, error: nil)
            let foundRanges = regex?.matchesInString(textView.string!, options: nil, range: NSRange(location: 0, length: count(textView.string!)))

            let firstFound = foundRanges![0] as! NSTextCheckingResult
            textView.showFindIndicatorForRange(firstFound.range)
         }
    }

}

这将突出显示第一个找到的匹配。然后,您可以实现按钮或某些东西来迭代匹配(例如,通过存储" foundRanges"某处并使用按钮迭代其索引等)。您可能还希望实现一些错误检查和/或可选链接,因为我的示例中的所有这些nils和强制向下转发可能会导致崩溃。