尝试在Obj-C中实现静态3D Touch快捷操作

6

我希望设置一个基本的3D Touch。在我的主界面上,我有一个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 touch操作无效。我确定我错过了什么,但我不知道是什么。viewdidload中需要添加一些内容吗?

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

谢谢!


“quote_opt”看起来像是一个开关,你确定它已经加载了吗?也许你可以在handleShortcutItem中引发一个标志,然后在加载视图后,相应地选择段索引。 - EDUsta
我该怎么做呢?(抱歉,我还在学习编程) - Branch
2个回答

1

注意:在此之前,您应该检查是否调用了handleShortCutItem,if-case是否按预期工作,并且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;
        }
    }
}

一切都很顺利,直到我添加了@property shortcutAction shortcutAction;,它说“未知的类型名称shortcutAction”。 - Branch
快捷键应该在添加它的地方定义(可能需要在多个地方定义,但我不建议这样做),并且应该是ShortcutAction而不是shortcutAction - EDUsta
抱歉,我不明白。它在同一个文件(ViewController.m)中,将其放置在除我的其他@property之外的任何地方都会导致出现大量错误。 - Branch
让我们在聊天中继续这个讨论 - EDUsta
这个问题在聊天中没有得到解决,现在为该问题添加赏金。 - Branch
显示剩余4条评论

1

您还需要在didFinishLaunchingWithOptions中检查launchOptions

因此,根据进行中的聊天结果,这是最新的代码:

AppDelegate

- (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];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接