ios - 解析对象中的核心亮点

标签 ios search ios9 corespotlight

我的应用程序使用放入 PFTableViewController 中的解析对象。该应用程序的用户可以添加新内容,对于使用该应用程序的其他每个人来说,这将显示为一个新单元格。我想在此实现 iOS 9 的核心 Spotlight 功能,以便当用户打开应用程序时,它会索引 PFObjects 中的数据。例如,应用程序(祈祷应用程序)中的用户说,他们需要为自己是一个酒鬼祈祷……其他人可以在手机上进入 Spotlight 搜索,输入酒鬼,然后就会显示该特定请求。我在《App Search 编程指南》中看到的类似内容的示例是用 Swift 编写的,而我对 Obj-C 更熟悉,并且不想仅仅为了这个应用程序而将这个应用程序的整个类重写为 Swift特征。它也是一次性使用的项目,有人可以帮助指导我转换为 Obj-C 以及如何让它一次索引所有 20 个可见的项目,并在它们向下翻页时继续索引吗?

// Create an attribute set to describe an item.
let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeData as String)
// Add metadata that supplies details about the item.
attributeSet.title = "July Report.Numbers"
attributeSet.contentDescription = "iWork Numbers Document"
attributeSet.thumbnailData = DocumentImage.jpg

// Create an item with a unique identifier, a domain identifier, and the attribute set you created earlier.
let item = CSSearchableItem(uniqueIdentifier: "1", domainIdentifier: "file-1", attributeSet: attributeSet)

// Add the item to the on-device index.
CSSearchableIndex.defaultSearchableIndex().indexSearchableItems([item]) { error in
   if error != nil {
      print(error?.localizedDescription)
   }
   else {
      print("Item indexed.")
   }
}

最佳答案

首先,无需在 Swift 中执行,这里有 Obj-C 代码和文档。

示例:

CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString*)kUTTypeJSON];

attributeSet.title = title;
attributeSet.contentDescription = description;
attributeSet.keywords = @[keywords];
attributeSet.thumbnailData = thumbnailData;

CSSearchableItem *item = [[CSSearchableItem alloc] initWithUniqueIdentifier:identifier domainIdentifier:domainIdentifier attributeSet:attributeSet];

[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item] completionHandler: ^(NSError * __nullable error) {
    NSLog(@"Indexed");
}];

我认为你想要解决这个问题的方法是创建一个函数,在你完成加载/呈现 Parse 信息后调用(即基本上在你的 PFTableViewController 的 TableView 更新的任何时候)

您将不得不执行一个 for 循环,并使其非常动态地接收每个单元格/行的信息。

就核心 Spotlight 搜索中显示的内容而言,您必须为每个项目设置关键字。请注意,关键字区分大小写,我花了一段时间才注意到。这些关键字将与该单元格/行匹配。

就打开应用程序而言,有一种方法可以在您使用 NSUserActivity 的 AppDelegate 中使用,通过它的用户信息或您想要的任何方式,并获取从那里获取信息以打开某个页面。

-(BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray * _Nullable))restorationHandler

希望对您有所帮助!让我知道我是否可以做任何其他事情来使它更清楚一点,因为我知道我不是最擅长使事情简洁的人。编码愉快!


在这里回复@user717452 评论以获得更好的样式

您只提到了 swift,所以我展示了 Spotlight 搜索的 objective-c 代码是什么样的。

您可以循环遍历您的 PFObject,假设它是一个 PFObject 数组,只需执行一个常规的 for 循环和一个内部带有字典的可变数组。假设您的 PFObject 是这样的:parse.com/docs/ios/api/Classes/PFObject.html

NSMutableArray *mutArray = [[NSMutableArray alloc] init];
for(int i=0; i<pfobjectArray.count;i++ {
   [mutArray addObject:@{@"title":[pfobjectArray[i] title], @"keywords":[pfobjectArray[i] keywords], @"thumbnail_data":[pfobjectArray[i] thumbnail], @"identifier":[pfobjectArray[i] identifier]}];
}

然后使用“mutArray”进行 spotlightSearch。

for(int i=0; i<mutArray.count;i++) {


   CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString*)kUTTypeJSON];
   attributeSet.title = mutArray[i][@"title"];
   attributeSet.contentDescription = mutArray[i][@"description"];
   attributeSet.keywords = [NSArray arrayWithArray:mutArray[i][@"keywords"]];
   attributeSet.thumbnailData = mutArray[i][thumbnail_data];

   CSSearchableItem *item = [[CSSearchableItem alloc] initWithUniqueIdentifier:mutArray[i][@"identifier"] domainIdentifier:@"com.iphone.app" attributeSet:attributeSet];
      [arrayOfItems addObject:item];
   }

[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:[arrayOfItems mutableCopy] completionHandler: ^(NSError * __nullable error { NSLog(@"Spotlight Popular"); }];

关于ios - 解析对象中的核心亮点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32747532/

相关文章:

ios - 为什么没有使用 removeDeliveredNotifications 删除通知?

ios - 如果字符限制超过 80 个字符,则不会发送推送通知

python - 单个数据库列的搜索引擎

swift - 在 iOS 9.0 中通过 WhatsApp 分享

ios - 替换 iOS 9 中的 NSAttributedString initWithFileURL

iphone - 设置导航栏标题的对齐方式

search - 使用 elasticsearch 集群和 Web 服务器集群避免单点故障的最佳方法

c# - 按顺序获取第一个缺失元素的有效方法?

ios - 在 IOS 中动态添加新标签

ios - 是否可以在Flutter中更改CupertinoTabBar的高度?