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:
- 这个词是未定义的
- 没有安装字典
这实际上真的非常无益。 我在我的特定英语应用程序用例中处理所有这些的策略是:
-
如果[UIReferenceLibraryViewController dictionaryHasDefinitionForTerm:word]返回true,则调用当前的“定义函数”并返回。
-
但是,如果它返回false,则使用应在所有英语词典中定义的单词调用dictionaryHasDefinitionForTerm,例如“the”或“word”。
-
如果“the”或“word”返回true,则会安装词典,但在已安装的词典中未定义此词。 缓存“该”/“单词”的结果,这样您就不必重复步骤2,但不要永久保存,因为用户或系统可能会删除字典 – 整个字典系统似乎非常错误。
-
如果“the”或“word”返回false,我们可以认为这意味着没有安装字典。 此时我调用函数来呈现原始单词的定义(自然地用“无定义”显示,但这是用户访问“管理”词典function以便安装字典的唯一方法!) ,以及一个对话框,解释用户需要点击“管理”并安装英语字典,如果他们想要单词定义。
离理想很远,但不确定我在用例中还能做些什么。
不确定这是否真的回答了这个问题,但是这里你可能有兴趣了解一下:
- 如果您打开
UIReferenceLibraryViewController
(甚至在应用程序之外,例如从Safari) 并点击管理那里显示字典列表(即使没有下载任何内容),当前模拟器的错误消失。 - 在模拟器上重置内容和设置会收到错误 – 直到您再次执行#1。
- 奇怪的是,在设备上我经常在
dictionaryHasDefinitionForTerm:
得到YES
dictionaryHasDefinitionForTerm:
即使我在控制器中看到“找不到定义”。
其中一些肯定是一个bug 🙂
我很好奇,知道是否有人在#3中有相同的行为,因为它闻起来比在日志中乱扔垃圾更糟糕。
- 包含正斜杠/和HTML的string的NSJSONSerialization序列化被错误地转义
- 如何在XCode 4.2中使用Retina显示iPad模拟器,Mac OS 10.6.8(Snow Loepard)
- ARKit 2.0重新整合对象
- 通过NSDate对象属性的Swiftfilter
- 识别UIStoryboard
- 提醒IOS 5 UITableView外观和devise
- iOS:UITableViewController – cellForRowAtIndexPath单元格创build
- 用Xcode 7运行UITesting时出现'NSInternalInconsistencyException'
- 在Swift中显示来自SQLite Blob的图像