如何从NSTokenField删除令牌? [迅速4.2]

在过去的几天中,我花费了大量时间正确地实现了具有某些拖放功能的标准NSTokenField。

知道了这一点,我们可以检查objectValue对象的类型是否等于我们期望的代表对象的类型。 如果确实如此,我们知道我们需要删除整个令牌。 然后,我们通过将stringValue拆分为一个数组并将其与objectValue中的对象数进行比较来检查对象数。

  如果让 anyObjectsArray = control.objectValue 作为 ?  [ 任何 ],  tokenFieldObjects = anyObjectsArray  ?  [标签] { 
//现在,我们继续删除令牌…
stringObjectComponents = control.stringValue.split(separator:“,”)
//检查令牌数是否等于tokenField的stringValue中的对象
  如果 tokenFieldObjects.count == stringObjectComponents.count { 
//接下来,找出要删除的对象
}
}

我们确信,我们必须删除令牌。 但是,在此阶段,我们不知道必须删除哪个令牌或多少个令牌。 幸运的是,找到它相对容易(当您知道时)。

如何找出要删除的令牌?

实例方法control(_:textView:doCommandBy :)还提供了NSTextView,如果您想找出光标在令牌字段中的位置,该类非常方便。 NSTextView有一个名为rangeForUserTextChange的方法,该方法返回一个NSRange,该NSRange由位置长度组成。

  var textChangeLocation = textView.rangeForUserTextChange.location 
textChangeLength = textView.rangeForUserTextChange.length

我们暂时忽略长度 (稍后再讨论),并专注于location 。 我们只需要检查位置是否少于对象数。 如果是的话,我们需要将其减少1以获取对象在数组中的索引,因为数组的索引为零,而NSRange从1开始。

  如果 textChangeLocation <tokenFieldObjects.count { 
// NSRange不是零索引的
索引= textChangeLocation-1
tokenFieldObjects.remove(at:index)
} 其他 {
// textChangeLocation指向最后一个元素
tokenFieldObjects.removeLast()
}

等等! 我们能够从NSTokenField删除单个令牌。 但是,如果您密切注意上面的视频,我还演示了选择多个令牌并一次将其全部删除的过程。

如何一次删除多个令牌?

为了删除多个令牌,我们需要使用以前忽略的长度分量。 一旦选择了多个标记, 长度将大于0。准确地说,长度将具有所选标记的确切数量。

因此,由于位置,我们知道了起始位置,并且由于长度,我们知道选择了多少令牌。 这就是说,我们可以编写一个从位置位置+长度的简单循环(由于索引为零,所以减去1)。 Swift为我们提供了stride(from:to:by 🙂方法。

  //删除选定的令牌-> NSRange.length具有选定令牌的数量 
如果 textChangeLength> 0 {
for i in stride(from:textChangeLocation,to:textChangeLocation + textChangeLength,by:1){
tokenFieldObjects.remove(at:i)
}
}

而已。 现在,我们可以从NSTokenField删除单个令牌,多个选定的令牌以及错别字。