快捷方式的 3D Touch 崩溃

Posted

技术标签:

【中文标题】快捷方式的 3D Touch 崩溃【英文标题】:3D Touch for Shortcuts Crashes 【发布时间】:2017-01-20 04:29:14 【问题描述】:

我的应用是作为根视图控制器样式应用的单视图 NavigationController。在其中,我有一些使用 3D Touch 的不同快捷方式。我将它们全部设置在 Info.plist 中(我之前使用 Tab Bar 应用程序完成了此操作,并且效果很好),但每次按下快捷方式操作时它都会崩溃。这是我在 Obj-C 中 AppDelegate 中使用的代码。

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler 
    UINavigationController *nav = (UINavigationController *) self.theMainView.view;

    NSLog(@"%@", shortcutItem.type);
    if ([shortcutItem.type isEqualToString:@"com.316apps.Fritch.inviteFriends"]) 
        ImagePicker *vimeo= [[ImagePicker alloc] init];
        [nav pushViewController:vimeo animated:YES];

    
    if ([shortcutItem.type isEqualToString:@"com.316apps.Fritch.viewAlerts"]) 

        NewsViewController *dvController8 = [[NewsViewController alloc] initWithNibName:@"NewsViewController" bundle:[NSBundle mainBundle]];
        [nav pushViewController:dvController8 animated:YES];

    
    if ([shortcutItem.type isEqualToString:@"com.316apps.Fritch.viewDirectory"]) 

        DirectoryViewController *dvController8 = [[DirectoryViewController alloc] init];
        [nav pushViewController:dvController8 animated:YES];


    



崩溃日志:

com.316apps.Fritch.viewDirectory
2017-01-19 22:44:23.305906 Fritch[3956:925348] -[UILayoutContainerView pushViewController:animated:]: unrecognized selector sent to instance 0x101837530
2017-01-19 22:44:23.306768 Fritch[3956:925348] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UILayoutContainerView pushViewController:animated:]: unrecognized selector sent to instance

【问题讨论】:

请添加崩溃日志。 你100%确定ImagePicker是一个viewController吗?与其他命名相比,它表明这是一个视图。你所有的其他控制器都有这个方案:someViewController 而不仅仅是some。如果我们遵守您的约定,那么它应该是ImagePickerViewController。因此,我为什么要问,这是一个错误吗? @Brandon 它是一个视图控制器。我正在更新这个应用程序,它曾经是一个标签栏控制器。虽然它是一个标签栏控制器,但我能够获取当前标签,将其初始化为根视图控制器,然后将我需要的任何视图推送到它上面。这些快捷方式在这方面工作得很好,我只需要弄清楚如何让它在 UINavigationController 作为根而不是选项卡上正常工作。 @nynohu 我添加了崩溃日志 【参考方案1】:
UINavigationController *nav = (UINavigationController *) self.theMainView.view;

崩溃的原因是你得到的是view,而不是ViewController。所以self.theMainView.view 不能转换为UINavigationController。如果您的 self.theMainView 是正确的,请使用以下方法修复该崩溃:

UINavigationController *nav = (UINavigationController *) self.theMainView; 

【讨论】:

不客气。对了,如果您的问题是应用崩溃,请记得添加崩溃日志,下次您要询问时。 我确实有一个有点相关,有点不同的问题。对于快捷方式上出现的 DirectoryViewController,我对其进行了密码保护。如果尚未输入密码,它会使用 IB 中存在的 UIView 覆盖该主视图。当我执行快捷方式时,会提示输入 Touch ID,但它不会添加该子视图。它是这样被调用的:` [self.navigationController.view addSubview:password]; [self.navigationController.view bringSubviewToFront:password];` 这是因为 self.navigationController 不是视图吗? 在我看来,你应该得到ViewController,而不是navigationController,而不是addSubView。你能试试吗? 我在***.com/questions/41756488/… 提出了一个新问题我已经尝试了self.view addSubview

以上是关于快捷方式的 3D Touch 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

3D Touch 快捷方式小工具

App Shortcuts 快捷方式 Android7.1 的"3D Touch"

3D touch快捷应用:didfinishlaunchingwithoptions:performActionForShortcutItem:执行顺序

iOS开发之3D Touch

iOS开发--3D Touch的基本使用

IOS 实现3D Touch在tableView的简单应用(swift版)