【发布时间】:2016-10-14 10:17:11
【问题描述】:
我正在尝试使用 Spotlight 结果将用户引导至我的应用中的相应部分。
这是我的结构,希望它能很好地说明它。
Navigation Controller
|
|-- Main View
|-- About View
|
|-- SplitView Controller (Presented Modally;StoryboardID: PhoneDirectory)
|-- Master View Controller
|-- Detail View Controller
|--Another View
当搜索结果第一次将用户带到我的应用时,一切正常。我可以展示SplitViewController,然后将用户发送到相应的DetailView。
但是,如果用户在当前状态下离开应用并返回搜索并点击另一个结果,则用户将返回应用并加载上一个视图。
我现在不知道该怎么做。
- 我是否
pop上一个视图?如果有,怎么做? - 是否在详细视图中重新加载数据?如果有,怎么做?
- 我如何确定我已经呈现了一个需要用不同数据呈现的视图?
使用下面的代码,我在第二次搜索结果选择中收到以下警告:
Warning: Attempt to present <PhoneDirectorySplitViewController: 0x7fdf398ab600> on <UINavigationController: 0x7fdf3c831600> whose view is not in the window hierarchy!
这是我到目前为止的代码(精简)
AppDelegate.m
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
NSString *uid = nil;
if ([[userActivity activityType] isEqualToString:CSSearchableItemActionType] || [[userActivity activityType] isEqualToString:@"com.myapp.activity"]) {
uid = [userActivity userInfo][CSSearchableItemActivityIdentifier];
}
if (uid != nil) {
NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
f.numberStyle = NSNumberFormatterDecimalStyle;
NSNumber *idNum = [f numberFromString:uid];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController *navController = nil;
navController = [storyboard instantiateViewControllerWithIdentifier:@"PhoneDirectory"];
if (navController != nil) {
[[[self window] rootViewController] presentViewController:navController animated:YES completion:nil];
PhoneDirectoryMasterViewController *master = [[[[navController viewControllers] firstObject] childViewControllers] firstObject];
[master selectRowWithId:idNum];
return YES;
}
}
return NO;
}
MasterView.h
- (void)selectRowWithId:(NSNumber *)uid {
[[self displayedPersons] enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(id == %@)", uid];
NSArray *filteredPersonsArray = [obj filteredArrayUsingPredicate:predicate];
if ([filteredPersonsArray count] > 0) {
NSIndexPath *targetIndexPath = [NSIndexPath indexPathForRow:[[[self displayedPersons] objectForKey:key] indexOfObject:filteredPersonsArray[0]] inSection:[[self personIndexTitles] indexOfObject:key]];
[[self tableView] selectRowAtIndexPath:targetIndexPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];
[self performSegueWithIdentifier:@"showPhoneDirectoryDetail" sender:self];
}
}];
}
如果您需要更多信息,请告诉我。
【问题讨论】:
标签: ios objective-c uinavigationcontroller uisplitviewcontroller