UIReferenceLibraryViewController hasDictionaryDefinition仅适用于iPhone 5s上的模拟器

当我调用此代码时:

NSString* word = @"hello"; bool response = [UIReferenceLibraryViewController dictionaryHasDefinitionForTerm:word]; 

…在iPhone 5s或更高版本上,我得到正确的值为’response’(bool取决于变量’word’是否在本地词典中定义。在模拟器上执行大约需要500ms。

但是,当我在iPhone 4s,5,6或6+模拟器(但不是5s)上调用它时,它会立即返回为假并将以下内容写入日志:

  +[_UIDictionaryManager _availableDefinitionDictionaries] returned nil. Error: Error Domain=ASError Code=21 "The operation couldn't be completed. (ASError error 21 - Unable to copy asset information)" 

字典function应该适用于iOS 5+。 我没有任何iPhone 4s / 5/6/6 +设备来测试这个。

到底是怎么回事?

我想我最终找到了答案,即控制台中的消息试图说用户没有安装字典。

这个事实

 [UIReferenceLibraryViewController dictionaryHasDefinitionForTerm:word]; 

如果返回false:

  • 这个词是未定义的
  • 没有安装字典

这实际上真的非常无益。 我在我的特定英语应用程序用例中处理所有这些的策略是:

  1. 如果[UIReferenceLibraryViewController dictionaryHasDefinitionForTerm:word]返回true,则调用当前的“定义函数”并返回。

  2. 但是,如果它返回false,则使用应在所有英语词典中定义的单词调用dictionaryHasDefinitionForTerm,例如“the”或“word”。

  3. 如果“the”或“word”返回true,则会安装词典,但在已安装的词典中未定义此词。 缓存“该”/“单词”的结果,这样您就不必重复步骤2,但不要永久保存,因为用户或系统可能会删除字典 – 整个字典系统似乎非常错误。

  4. 如果“the”或“word”返回false,我们可以认为这意味着没有安装字典。 此时我调用函数来呈现原始单词的定义(自然地用“无定义”显示,但这是用户访问“管理”词典function以便安装字典的唯一方法!) ,以及一个对话框,解释用户需要点击“管理”并安装英语字典,如果他们想要单词定义。

离理想很远,但不确定我在用例中还能做些什么。

不确定这是否真的回答了这个问题,但是这里你可能有兴趣了解一下:

  1. 如果您打开UIReferenceLibraryViewController (甚至在应用程序之外,例如从Safari) 点击管理那里显示字典列表(即使没有下载任何内容),当前模拟器的错误消失。
  2. 在模拟器上重置内容和设置会收到错误 – 直到您再次执行#1。
  3. 奇怪的是,在设备上我经常在dictionaryHasDefinitionForTerm:得到YES dictionaryHasDefinitionForTerm:即使我在控制器中看到“找不到定义”。

其中一些肯定是一个bug 🙂
我很好奇,知道是否有人在#3中有相同的行为,因为它闻起来比在日志中乱扔垃圾更糟糕。