高度选择性

使用键盘选择列表中的多个项目有两种模型:锚定and非锚固

锚定:选择在一个方向上增长,在另一个方向上缩小在锚定选择模型中,如果使用Shift-Down在列表中选择两个或更多项目,则按Shift-Up将取消选择范围底部的项目(反之亦然:如果您首先选择带有Shift-Up的项目,则从选择的顶部取消选择Shift-Down。)

非锚定的:选择在两个方向上增长,从不缩小在非锚定选择模型中,Shift-Down始终向下扩展选择范围,Shift-Up始终向上延伸。

这两个模型之间的争论出现在“尾声”的尾端。与先生站在一起吉米“两个星期前,当我提到Tim Bray对Apple Mail中消息选择的抱怨时,抱怨的是Mail使用了未经锚定的模型我同意Bray的观点,即无限制的选择令人沮丧,但我也指出,因为未锚定的模型是Cocoa的NSTableView控件以及Carbon Data Browser控件的默认行为,所以它实际上用于比锚定模型更多的应用程序。1一些常见示例包括Mail的消息列表,Safari的书签列表,iChat的好友列表窗口,Finder的列表和列视图,以及iTunes中的歌曲和浏览器列表。

有反例使用锚定模型,但在我经常使用的应用程序中,我只能组装一个相当短的列表:Firefox(例如在其书签窗口中)和Bare Bones Software的BBEdit,TextWrangler和Mailsmith。2Microsoft Excel和AppleWorks中的单元格选择也以这种方式工作,电子表格表格实际上只是二维列表。

这种稀疏的分类可能看起来像对抗锚定模型的证据Firefox和Microsoft Office通常不被认为是适当的Mac用户交互和界面设计的典范,而且几年前AppleWorks在藤蔓上萎靡不振And while one’s knee-jerk response to BBEdit and its siblings’ use of the anchored list selection model might be to chalk it up to the fact that they’re Carbon and old, I’ll point out that other venerable Carbon apps such as Eudora, Interarchy, and Fetch now handle keyboard list selection using the unanchored modelBoth Fetch and Interarchy now use the Carbon Data Browser list control; but Eudora doesn’t, and I believe Eudora has总是这样工作(BBEdit不会将碳数据浏览器用于其列表。)

我确信还有其他Mac应用程序提供锚定列表选择的例子,但重点仍然是绝大多数软件现在都遵循Apple的主导并使用非锚定模型进行列表项选择如果“Mac-like”意味着“大多数其他Mac软件所做的”,那么在这种情况下,类似Mac的行为是错误的,或者至少更糟。

整个争论的关键:锚定选择的主要优点是它可以让您轻松,即时,直观地补偿错误:如果您按下Shift-Down太多次,只需按住Shift-Up来补偿然而,对于未锚定的模型,它是不可能在没有(a)从头开始整个选择,或(b)使用鼠标的情况下从“过远”错误中恢复。

“先生”中的一个脚注吉米“一块, 我问:

是否任何人actually prefer this behavior? This is one of the most baffling design decisions in all of Mac OS X, because I just can’t see how anyone would want it to work this way.

我没有收到任何声称喜欢此行为的人发来的电子邮件不是一个也许那些无法选择的名单选择爱好者现在会开始跳出木制品,但我对此表示怀疑我从DF读者那里得到的唯一反馈来自于那些希望在这个问题上重复思考的人,他们毫不含糊地表达了他们对Mac OS X默认键盘列表选择行为的挫败感和困惑。

这意味着我们处于这样一种情况:几乎所有Mac软件都以几乎每个人 - 或者至少每个关心的人 - 的方式处理基于键盘的列表选择认为次优3


当我问是否任何人喜欢非锚定模型,问题至少有点夸张:显然Apple的某个人更喜欢这种行为,因为这就是NSTableView和数据浏览器控件的工作方式。

Why? DF reader Stuart Lamble offered this explanation via email:

With the UI as Apple currently has it, there’s no ambiguity: it’ll expand the selection to that itemWith the other way, you don’t know也许它会减少选择,也许它会扩大它It depends on where the first item selected happens to be in the list.

I’m not saying that I believe it’s the right choice to make, but I can understand why a UI designer might make that choice.

我同意这个论点有一定的说服力这里的想法是锚定选择涉及一个不可见的标记:你不能仅仅通过查看列表中的多个项目的选择来判断哪个结束是锚点例如想象你坐在电脑前看到列表中间选择了四个项目,但你不知道如何做出选择(Shift-Down?Shift-Up?用鼠标?)在这种情况下,你不会知道如果你按下Shift-Up或Shift-Down会发生什么另一方面,使用非锚定模型,您始终知道:Shift-Up将在顶部延伸,Shift-Down将在底部延伸。

然而,这对我来说是一个人为的设想,因此对于无法选择的选择来说是一个不合理的理由How often do you come back to your computer, or switch back to an app that’s been in the background for an extended period, and decide to begin extending an existing multiple-item list selection? I think selections are almost always made in one step, and so in practice, anchored selection is never confusing.4

非锚定选择的更明显的理由是它允许您通过从预期范围中间的项目开始进行多项目选择然而,这似乎有点做作就我而言,我永远不会这样做。

Neither justification for unanchored selection is sufficient to put aside the aforementioned key advantage of anchored selection: that it allows you to easily correct mistakes without reaching for the mouse, because it allows you to both extend并缩小使用键盘选择。

使用鼠标选择(或取消选择)列表中的项目没有任何问题 - 我经常这样做,当我的手已经在鼠标上但是,您不必因为选择了太多的项目而不必使用键盘快捷键切换到鼠标。

您可以轻松地从错误中恢复,这是软件整体可用性的良好指标Two good rules of thumb: it should be easy to recover from mistakes; and it should be difficult to make mistakes that cannot easily be undone (e.g在清空垃圾之前要求确认)。

用鼠标选择多项目非常容忍错误如果您单独使用鼠标,则可以通过单击并拖动来选择一系列项目,从而在列表中选择多个项目如果你点击第一个项目,然后向下拖动但是走得太远,你可以向上拖动(同时按住鼠标按钮)来纠正你的范围换句话说,仅鼠标选择是锚定,这很好,因为它可以轻松地进行修正。

但是,一起使用鼠标和键盘来选择项目非锚固:如果您选择了一个项目,则按住Shift键并单击该项目的上方和下方,同时按住Shift键单击到选择范围但是,在这种情况下,非锚定选择显然是所要求的如果在按住Shift键单击或按住Command键单击时出错,则可以通过按住Shift键单击或再次按住Command键来纠正错误一起使用鼠标和键盘显然是创建多项选择最具表现力的方法,因为它允许您选择不连续的项目,这是单独使用键盘或鼠标无法完成的This expressiveness comes at the expense of complexity, however; those of you reading this are likely well aware of these Shift-click and Command-click selection actions, but many Mac users aren’t.

没有理由为什么你必须重新开始或切换到鼠标加键盘快捷键只是因为你在使用仅限键盘(Shift-arrow)快捷方式时用一些物品超出预期范围The keyboard-only shortcuts should use the anchored behavior for the same reason the mouse-only shortcuts使用锚定行为:使其易于从错误中恢复。

想想Finder图标视图中的橡皮筋选择模式(以及Finder列表视图的旧版本):当你来回拖动时,它会增大和缩小如果它只是增长并且永远不会缩小,那将是愚蠢的 - 但这正是单独的仅限键盘选择快捷方式的行为方式。


在列表中使用锚定选择键盘快捷键的另一个原因是与文本视图中的选择模型一致使用Shift和箭头键选择一系列文本时,反转方向将取消选择,包括左右和上下我不知道Mac的单个文本编辑UI,其中基于键盘的文本选择是非锚定的[更新:Eudora is an exception; it uses the unanchored model for keyboard-based text selectionUI疯狂。] UI设计的一致性的一个方面是类似的事情应该以类似的方式表现用键盘选择文本并用键盘从列表中选择项目是不一样的 - 例如在列表中没有插入点这样的东西,虽然文本可以看作是一个有序的字符列表,但它也可以作为一系列单词,行,段落等遍历。- 但它们非常相似而且,在基本级别,这些任务的键盘快捷键大致相似:按住Shift键同时按箭头键可以按箭头键的方向扩展选择,用于列表和文本But in text views, you can compensate for mistakenly going too far by reversing your direction; in lists, you can’t.

I almost hesitate to draw attention to this analogy between text selection and list item selection, lest whoever it is at Apple who favors unanchored selection for lists mandate that text selection in NSTextView and friends be changed from anchored to unanchored, for the sake of consistency — I’d rather the current inconsistency remain than see text selection changed to the unanchored model.

简而言之,Apple通过为列表选择非锚定选择做出了糟糕的权衡当你获得一个小的好处(能够增长选择范围的两端)时,你会受到很大的惩罚(当你超出你的预期范围时)。


不幸的是,基于对Apple人机界面指南的简单解读,没有办法解决这个论点,因为,至少就我所知,HIG对于锚定vs的问题保持沉默列表视图中基于键盘的非锚定选择。

然而,HIG确实涵盖了有关的问题文本意见如前所述,Mac软件中仅键盘文本选择几乎普遍遵循锚定模型,并且此行为在HIG的“使用Shift和箭头键扩展文本选择”部分

Reversing the direction of the selection deselects the appropriate unit在前面的例子中,如果单词is selected and the user presses Shift–Option–Right Arrow, sostop time选中,然后按Shift-Option-Left Arrow,时间被取消选择仍然被选中。

Even though the HIG does not explicitly cover Shift-plus-arrow-keys selection for lists, this phrase, “Reversing the direction of the selection deselects the appropriate unit,” could logically be applied to lists, where “unit” would simply mean a list item.

仅鼠标文本选择 - 通过点击并拖动而不使用任何键盘修饰符 - 通常固定在Mac软件中,这也是HIG规定的但是关于同时使用鼠标和键盘,HIG描述了两种模型,它们在起点的另一侧按住Shift键点击时会发生什么不同想象一个包含单词“foobar”的文本字段,插入点位于中间,“o”和“b”之间如果在“r”后按住Shift键并单击,则会选择“栏”But what happens if you then Shift-click before the “f”? In the加法模型,选择被扩展,现在选择整个单词“foobar”在里面定点模型,选择从“bar”变为“foo”。

这些术语 - 加法和定点 - 来自于关于选择的HIG部分,分别对应于非锚固and锚定我为这篇文章选择的术语。HIG允许两种模型,但由于以下原因支持添加模型:

When considering which model to use in your application, keep in mind that the addition model provides more flexibility by allowing users to extend a selection in方向。

大多数Mac应用程序遵循此建议,使用添加/非锚定模型进行基于鼠标的键盘文本选择首先,它是NSTextView和NSTextField的默认行为,因此它也是几乎所有Cocoa应用程序的默认行为但它也是Shift-click选择在BBEdit,iTunes和Finder中的工作方式。

The fixed-point model for Shift-click text selection can be seen in Adobe Photoshop and InDesign, Microsoft Word and Excel, and the main editing view in TextMate (which uses Cocoa but uses a custom control instead of NSTextView for its main text editing view, which in turn means that while TextMate uses the fixed-point model in its main text views, it uses the Cocoa-standard additive model for all of the little text fields in its dialog boxes, because those controls常规Cocoa文本字段 - 在Adobe和Microsoft的应用程序中,定点模式的使用在整个应用程序中是一致的)。

尽管HIG允许这两种惯例,但我认为增加了 - a.k.aunanchored - 模型明显优于Shift-click文本选择除了HIG之外,添加模式允许在两个方向上扩展选择允许通过单击Shift键单击缩小选择回到我们的“foobar”示例,如果将插入点放在“o”和“b”之间,然后按住Shift键并单击“r”,则会选择“bar”但如果您只想选择“ba”,则只需在“a”和“r”之间再次按住Shift键即可。

即when selecting a range — either characters of text, or items in a list — there are two primary ways you might wish to adjust an existing selection range: deselecting from the end of the range, and selecting additional items (or characters) at the beginning of the range使用Shift键单击鼠标键盘选择的加法模型,您可以同时执行这两项操作,这样既可以轻松添加到任一端的选区,也可以在两端修剪选区。

但是只使用键盘选择,就没有办法同时允许两者 - 或者至少没有办法允许两者都没有指定其中一个动作除Shift之外的键盘序列加上当前箭头方向的反转。6同样,没有办法允许扩展和修剪仅使用鼠标选择的结尾。


那么,该怎么办?

从我对HIG的阅读中,目前推荐的选择行为规则如下:

模式 名单 文本
鼠标只
仅键盘
鼠标加键盘 非锚固 未锚定(首选)

理想情况下,Apple应更新HIG以推荐用于列表中仅键盘选择的锚定模型,并且应相应地修改NSTableView和数据浏览器控件(Apple可以添加一个隐藏的系统范围默认preference toggle for this behavior, leaving the default behavior as-is but making anchored selection an option for nerds who care; but I’m not sure they could do this with one setting that works in both Cocoa and Data Browser-based Carbon apps.)

It’s a two-fold argument for consistency: (1) keyboard-only selection in lists ought to be anchored because keyboard-only selection in text views is anchored; and (2) keyboard-only selection ought to be anchored because mouse-only selection is, because keyboard-only selection is in general terms very similar to mouse-only selection — you get one button (the mouse button or the Shift key) and a current direction (the pointer movement or an arrow key).

我不建议在等待Apple更改时屏住呼吸。

对于第三方开发人员,我可以两种方式看到它一方面,他们当然不应该有义务覆盖或修改Apple标准列表控件的默认选择行为Cocoa和标准Carbon UI控件的吸引力很大一部分就是它们应该“正常工作”开发人员不必为控件定义和处理(和调试)他们自己的行为,从而节省了时间,精力和代码行,并且用户最终会以相同的方式使用一致的控件。

另一方面,我不认为开发人员应该避免在他们的软件中实现锚定键盘列表选择,因为它不是默认值HIG对这一特定问题保持沉默,这使得它成为公平的游戏AppKit不是HIG。

无论您是否个人同意,肯定都有一致性论据支持使用Apple提供的默认选择行为我们的想法是,通过使用默认行为,列表选择在软件中的工作方式与在其他任何地方几乎相同如果Apple确实改变了某些未来版本的Mac OS X中的行为,那么您的软件将“免费”获取新的默认行为。

但是包括Apple自己在内的Cocoa开发人员经常打破AppKit的默认设置:源列表上的浅蓝色背景和渐变选择带,自定义按钮控件 - 这些都不是Cocoa的标准,但是打破这些默认设置被认为是完全可以接受的这些视觉定制的理由归结为:Apple做到了,它看起来不错。

如果你愿意打破默认的视觉外观以寻找更好的东西,我不明白为什么你不愿意打破默认行为以获得更好的效果。

坚持大多数其他应用程序遵循的默认行为原则上是良好的学说It’s not quite fair to make an “If everyone else jumped off a bridge, would you?” argument for non-conformity in this particular case, because Apple’s use of unanchored keyboard-based selection in lists, while clearly inferior to anchored selection, is certainly not bridge-jumpingly bad.

但我要说的是:我真诚地怀疑任何改变这种情况的开发人员都会从用户那里得到一封电子邮件,要求他们恢复默认(无锚)基于键盘的列表选择行为与关于Cocoa默认行为的其他争论领域不同 - 例如点击问题7或文字选择拖放 - 我不相信这里有两个对立的阵营It’s not controversial; it’s just baffling.


后记,2008年2月20日:Apple改变了Cocoa的NSTableView的行为到锚定模型在Mac OS X 10.5 Leopard中。


  1. In many situations, multiple item selection is disallowed; in such cases this discussion is moot为简洁起见,我使用“列表选择”来表示“多项目列表选择”。↩︎

  2. 但是,值得注意的是,不在用心棒,它使用默认的NSTableView行为进行列表选择。↩︎

  3. 也有可能那些喜欢无锚选择的人甚至没有意识到他们更喜欢它 - 因为当前Mac OS X的许多软件只使用列表中的非锚定选择,他们可能甚至没有意识到还有另一种方式我不相信这一点,但提到它是公平的。↩︎

  4. 值得指出的是Excel并没有受到这个特殊缺陷的影响 - 您选择的第一个单元格的突出显示与您选择的其他后续单元格不同,这意味着您能够通过查看当前选择来说明将会发生什么这种视觉反馈在电子表格中特别有用,您可以在其中扩展二维选择例如,如果您选择单元格B2,然后按三次Shift-Down:

    Excel 2004中的一列中的多项选择

    如果你然后按Shift-Right一次,你得到:

    Excel 2004中的两列中的多项选择

    电子表格与常规NSTableView样式的二维列表不完全相同,但也许这个想法可以扩展到列表Imagine some sort of special visual treatment for the first item in a multiple-item selection — a darker color, perhaps? — that would serve as a visual indication of the anchor point.↩︎

  5. “定点”和“锚定”使我在语义上成为同义词,但“unanchored”在我看来比其他模型的“添加”更准确两种型号在某种意义上都是相加的,区别在于它们是否可以添加到选择范围的两端因此我决定采用锚定/非锚定。↩︎

  6. 较早版本的BBEdit曾经使这成为可能,因此您可以使用Shift和箭头键扩展和缩小*选择范围的*结尾,使用几乎每个人都发现令人困惑的一系列击键。↩︎

  7. 三年前在万博manbetx贴吧广泛覆盖在这里“点击问题“和”很多Ado关于点击率”。↩︎