CNContactViewController 对响应者链做了一些奇怪的事情
CNContactViewController does something strange with responder chain
我正在尝试在我的应用程序中实现 UIKeyCommand 快捷方式,并且在大多数情况下,它似乎工作正常。除了当我在模态视图中呈现 CNContactViewController 时,它似乎做了一些奇怪的事情:在 CNContactViewController 被关闭后,键盘快捷键仍然显示在可发现性 HUD 中,但在整个应用程序中停止工作,即使呈现视图控制器手动调用 becomeFirstResponder
在 CNContactViewController 被关闭之后。
这来自 FirstViewController:
- (void) showCNContacts {
CNContact * contact = [[CNContact alloc] init];
CNContactViewController *createContact = [CNContactViewController viewControllerForNewContact: contact];
createContact.delegate = self;
createContact.allowsActions = NO;
CNContactStore *store = [[CNContactStore alloc] init];
createContact.contactStore = store;
UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:createContact];
navigation.modalPresentationStyle = UIModalPresentationPageSheet;
[self presentViewController: navigation animated:YES completion: ^{
NSLog(@"presented CNContactVC - responder = %@", [[[UIApplication sharedApplication] keyWindow] performSelector:@selector(firstResponder)]);
}];
}
- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact {
[viewController dismissViewControllerAnimated:YES completion:^{
[self becomeFirstResponder];
NSLog(@"after dismissing CNContactVC - responder = %@", [[[UIApplication sharedApplication] keyWindow] performSelector:@selector(firstResponder)]);
}];
}
我使用私人 API 查看 firstResponder
,并且它正确显示 FirstViewController
作为第一响应者。 canBecomeFirstResponder
肯定是调用了,keyCommands
方法也是。按住 Command 键会调出可发现性 HUD,并显示键盘快捷键。
这显然是联系人框架的某种错误。只是不确定如何解决这个问题。在 dispatch_async
或 dispatch_after
中用 1 秒调用 [self becomeFirstResponder]
无效。很想听听一些想法。
谢谢。
我想出的解决方法是将 CNContactViewController 推送到导航堆栈,而不是尝试以模态方式呈现它。
我正在尝试在我的应用程序中实现 UIKeyCommand 快捷方式,并且在大多数情况下,它似乎工作正常。除了当我在模态视图中呈现 CNContactViewController 时,它似乎做了一些奇怪的事情:在 CNContactViewController 被关闭后,键盘快捷键仍然显示在可发现性 HUD 中,但在整个应用程序中停止工作,即使呈现视图控制器手动调用 becomeFirstResponder
在 CNContactViewController 被关闭之后。
这来自 FirstViewController:
- (void) showCNContacts {
CNContact * contact = [[CNContact alloc] init];
CNContactViewController *createContact = [CNContactViewController viewControllerForNewContact: contact];
createContact.delegate = self;
createContact.allowsActions = NO;
CNContactStore *store = [[CNContactStore alloc] init];
createContact.contactStore = store;
UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:createContact];
navigation.modalPresentationStyle = UIModalPresentationPageSheet;
[self presentViewController: navigation animated:YES completion: ^{
NSLog(@"presented CNContactVC - responder = %@", [[[UIApplication sharedApplication] keyWindow] performSelector:@selector(firstResponder)]);
}];
}
- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact {
[viewController dismissViewControllerAnimated:YES completion:^{
[self becomeFirstResponder];
NSLog(@"after dismissing CNContactVC - responder = %@", [[[UIApplication sharedApplication] keyWindow] performSelector:@selector(firstResponder)]);
}];
}
我使用私人 API 查看 firstResponder
,并且它正确显示 FirstViewController
作为第一响应者。 canBecomeFirstResponder
肯定是调用了,keyCommands
方法也是。按住 Command 键会调出可发现性 HUD,并显示键盘快捷键。
这显然是联系人框架的某种错误。只是不确定如何解决这个问题。在 dispatch_async
或 dispatch_after
中用 1 秒调用 [self becomeFirstResponder]
无效。很想听听一些想法。
谢谢。
我想出的解决方法是将 CNContactViewController 推送到导航堆栈,而不是尝试以模态方式呈现它。