试图让静态 3D 触摸快速操作在 Obj-C 中工作
Trying to get Static 3D touch Quick Actions to work in Obj-C
所以我想要一个非常基本的 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 中添加一些内容?
任何建议将不胜感激,我很乐意 post code/answer 解决问题所需的任何其他问题。
谢谢!
注意:在此之前,您应该检查handleShortCutItem
是否被调用,if-cases是否按预期工作,并且self.quote_opt
不为nil。
另注:3D 通常在 AppDelegate
中处理,是这样处理的吗?
最后说明:你可能想看看:
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
由于 3D 动作是在应用程序打开后立即处理的,因此很可能您的视图元素尚未加载。因此,您需要保存 3D 动作的信息并相应地加载。
你可以在你负责的class中添加一个标志,然后在加载视图后进行相应的修改。
方便切换的枚举:
// 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;
}
}
}
您还需要检查 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];
}
}
所以我想要一个非常基本的 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 中添加一些内容?
任何建议将不胜感激,我很乐意 post code/answer 解决问题所需的任何其他问题。
谢谢!
注意:在此之前,您应该检查handleShortCutItem
是否被调用,if-cases是否按预期工作,并且self.quote_opt
不为nil。
另注:3D 通常在 AppDelegate
中处理,是这样处理的吗?
最后说明:你可能想看看:
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
由于 3D 动作是在应用程序打开后立即处理的,因此很可能您的视图元素尚未加载。因此,您需要保存 3D 动作的信息并相应地加载。
你可以在你负责的class中添加一个标志,然后在加载视图后进行相应的修改。
方便切换的枚举:
// 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;
}
}
}
您还需要检查 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];
}
}