从 NSTokenField 中删除选定的令牌

问题描述 投票:0回答:2

我正在尝试向按钮添加删除选定标签操作,以删除 NSTokenField 中选定的标记。

@IBAction func deleteSelectedTag(sender: AnyObject) {
    let fieldEditor = (tagTokenField.cell() as! NSCell).fieldEditorForView(tagTokenField)
    if fieldEditor?.selectedRanges.count > 0 {
        fieldEditor?.delete
    }
}

此代码不会删除所选令牌。有什么想法吗?

macos cocoa swift nstokenfield
2个回答
0
投票

我发现执行此操作的唯一方法是使用字段编辑器返回的选定范围来编辑

NSTokenField.value
绑定到的数组:

@IBAction func deleteSelectedTag(sender: AnyObject) {
    let fieldEditor = (tagTokenField.cell() as! NSCell).fieldEditorForView(tagTokenField)
    if fieldEditor?.selectedRanges.count > 0 {
        let range = fieldEditor!.selectedRanges.first as! NSRange
        fieldEditor!.setSelectedRange(NSMakeRange(0, 0)) // Set to no selection
        selectedNote.tags!.removeRange(range.location..<range.location + range.length)
    }
}

经过测试,我发现 selectedRanges 总是只返回一个 NSRange,其中

location
是令牌索引,
length
是所选令牌的数量。至少我没有找到在 NSTokenField 中选择不连续标记的方法。


0
投票
 @objc func deleteToken(_ sender: Any?) {
    if let selectedToken = selectedToken(),
       var tokens = tokenField.objectValue as? [Any],
       let indexToRemove = tokens.firstIndex(where: { $0 as AnyObject === selectedToken as AnyObject }) {
        tokens.remove(at: indexToRemove)
        tokenField.objectValue = tokens
    }
}

func selectedToken() -> Any? {
    guard
        let selectedRange = tokenField.currentEditor()?.selectedRange,
        let tokens = tokenField.objectValue as? [Any]
    else {
        return nil
    }
    
    print("All objects in array: \(tokens.map { String(describing: $0) })")
    
    if selectedRange.location < tokens.count {
        return tokens[selectedRange.location]
    }
    return nil
}
© www.soinside.com 2019 - 2024. All rights reserved.