6

所以我想要一个非常基本的 3D 触摸设置。在我的主 UI 上,我有一个 2 选项分段控件,我基本上希望在使用 3DQuickActionA 时在打开时选择一个选项,在使用 3DTouchQuickActionB 时选择另一个选项。

我查看了该站点上的其他问题,其中一个建议我使用:

- (void)handleShortCutItem:(UIApplicationShortcutItem *)shortcutItem  {
if([shortcutItem.type isEqualToString:@"3DQuickActionA"]){
    self.quote_opt.selectedSegmentIndex = 0;    }
if([shortcutItem.type isEqualToString:@"3DQuickActionB"]){
    self.quote_opt.selectedSegmentIndex = 1;    }
}

其中 quote_opt 是我的分段控件的名称。

但是,这不起作用。我的应用程序启动正常,但只是将 quote_opt 的最后一个值作为当前选项——3D 触摸动作什么都不做。我确定我错过了一些东西,但我不知道是什么。是否需要在 viewdidload 中进行某些操作?

任何建议将不胜感激,我很乐意发布代码的任何其他部分/回答解决问题所需的任何其他问题。

谢谢!

4

2 回答 2

1

您还需要办理登机手续launchOptionsdidFinishLaunchingWithOptions

因此,作为正在进行的聊天的结果,这是最新的代码:

应用委托

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [FIRApp configure];

    if(launchOptions)
    {
        UIApplicationShortcutItem *selectedItem = [launchOptions objectForKey:UIApplicationLaunchOptionsShortcutItemKey];

        if(selectedItem)
        {
            [self applyShortcutItem:selectedItem];
        }
    }
    return YES;
}

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
{
    [self applyShortcutItem:shortcutItem];
}

- (void)applyShortcutItem:(UIApplicationShortcutItem *)shortcutItem
{
    ViewController *rootViewController = (ViewController *)[self.window rootViewController];

    if([shortcutItem.type isEqualToString:@"DogModeShortcut"])
    {
        [rootViewController setShortcutAction:LaunchDogMode];
    }
    else if([shortcutItem.type isEqualToString:@"CatModeShortcut"])
    {
        [rootViewController setShortcutAction:LaunchCatMode];
    }
}
于 2017-09-15T10:12:54.963 回答
1

注意:在此之前,您应该检查 if 是否handleShortCutItem被调用,并且 if-cases 是否按预期工作,并且self.quote_opt不是 nil。

另一个注意事项:3D 通常在 中处理AppDelegate,是这样处理的吗?

最后一点:您可能想看看:

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler

由于 3D 动作是在应用程序打开后立即处理的,因此您的视图元素很可能尚未加载。因此,您需要保存 3D 动作中的信息并相应地加载。

您可以在负责的类中添加一个标志,然后在加载视图后进行相应的修改。

一个便于切换的枚举:

// You may add additional items to your enum.

typedef NS_ENUM(NSUInteger, ShortcutAction) {
    ShortcutActionNone,
    ShortcutActionA,
    ShortcutActionB,
};

处理快捷方式:

- (void)handleShortCutItem:(UIApplicationShortcutItem *)shortcutItem
{
    if([shortcutItem.type isEqualToString:@"3DQuickActionA"])
    {
        self.shortcutAction = ShortcutActionA;
    }
    else if([shortcutItem.type isEqualToString:@"3DQuickActionB"])
    {
        self.shortcutAction = ShortcutActionB;
    }
    // self.shortcutAction will be defaulted to 0 -> ShortcutActionNone.
}

处理段开关:

// You should put this in the interface of your class.

@property ShortcutAction shortcutAction;

// And the implementation:

- (void)viewDidLoad
{
    [super viewDidLoad];

    if(!self.quote_opt)
    {
        // You have other problems, the quote_opt is not initialized yet, or properly.

        NSLog(@"ERR");
    }

    switch(self.shortcutAction)
    {
        case ShortcutActionNone:
        {
            // no-op
            break;
        }
        case ShortcutActionA:
        {
            self.quote_opt.selectedSegmentIndex = 0;

            break;
        }
        case ShortcutActionB:
        {
            self.quote_opt.selectedSegmentIndex = 1;

            break;
        }
    }
}
于 2017-08-22T11:41:35.607 回答