首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSUserActivity切换不适用于自定义数据

NSUserActivity切换不适用于自定义数据
EN

Stack Overflow用户
提问于 2014-11-03 21:38:07
回答 3查看 4.9K关注 0票数 11

我正在尝试使用NSUserActivity在我的iPhone和iPad之间测试iOS 8.1切换功能。为此,我尝试实现自己的解决方案,并使用苹果的PhotoHandoff项目。然而,它并不起作用。

如果我提供一个webpageURL,交接就能正常工作,但当我尝试使用userDataaddUserInfoEntriesFromDictionary时,什么都不能用,而且我永远也搞不清楚让数据工作的关键是什么。

示例代码:

代码语言:javascript
复制
NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:@"com.company.MyTestApp.activity"];
activity.title = @"My Activity";
activity.userInfo = @ {};
//    activity.webpageURL = [NSURL URLWithString:@"http://google.com"];

self.userActivity = activity;

[self.userActivity becomeCurrent];
[self.userActivity addUserInfoEntriesFromDictionary:@ { @"nanananan": @[ @"totoro", @"monsters" ] }];

(我也无法让它在具有相应活动类型的Mac应用程序上工作)

EN

回答 3

Stack Overflow用户

发布于 2015-04-16 22:40:16

我希望你已经找到了解决方案,但如果有人也遇到了这个问题,这里有一个解决方案。(实际上与之前的答案没有太大区别)

创建不带userInfo的用户活动,将被忽略:

代码语言:javascript
复制
NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:@"..."];
activity.title = @"Test activity";
activity.delegate = self;
activity.needsSave = YES;

self.userActivity = activity;
[self.userActivity becomeCurrent];

实现委托以对needSave事件做出反应:

代码语言:javascript
复制
- (void)userActivityWillSave:(NSUserActivity *)userActivity {
    userActivity.userInfo = @{ @"KEY" : @"VALUE" };
}

当needsSave设置为YES时,将调用此方法并更新userActivity。

希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2014-11-07 08:48:40

要更新activity对象的userInfo字典,您需要配置其委托,并在每次需要更新userInfo时将其needsSave属性设置为YES。

此过程在best practices section of the Adopting Handoff guide中进行了描述。

例如,对于一个简单的UITextView,您需要在NSUserActivityTypes数组的Info.plist属性列表文件中指定活动类型("com.company.app.edit")标识符,然后:

代码语言:javascript
复制
- (NSUserActivity *)customUserActivity 
{
    if (!_customUserActivity) {
        _customUserActivity = [[NSUserActivity alloc] initWithActivityType:@"com.company.app.edit"];
        _customUserActivity.title = @"Editing in app";
        _customUserActivity.delegate = self;
    }

    return _customUserActivity;
}

- (void)textViewDidBeginEditing:(UITextView *)textView 
{
    [self.customUserActivity becomeCurrent];
}

- (void)textViewDidChange:(UITextView *)textView 
{
    self.customUserActivity.needsSave = YES;
}

- (BOOL)textViewShouldEndEditing:(UITextView *)textView 
{
    [self.customUserActivity invalidate];

    return YES;
}

- (void)userActivityWillSave:(NSUserActivity *)userActivity 
{
    [userActivity addUserInfoEntriesFromDictionary:@{ @"editText" : self.textView.text }];
}
票数 2
EN

Stack Overflow用户

发布于 2015-08-31 00:12:16

顺便说一句,我遇到了这个问题。我很幸运,我的一种活动类型可以工作,另一种则不能:

代码语言:javascript
复制
Activity: Walking
(UserInfo x1,y1)
(UserInfo x2,y2)
(UserInfo x3,y3)
Activity: Standing
(UserInfo x4,y4)
Activity: Walking
etc.

如果在站立而不是行走时发生切换,我会得到userInfo。我在所有情况下都获得了其他属性,比如webpageURL;只有userInfo是通过null实现的。

我的解决方法是每次(例如,从x1/y1步行到x2/y2时)无效并重新创建NSUserActivity对象,而不是仅在活动类型更改时(例如,从步行到站立)。这在很大程度上不是文档的编写方式,但修复了iOS 9上的问题。

更新:这个变通方法在iOS 8上不起作用。你需要按照gregoryM的规定,通过userActivityWillSave委托来实现它。根据苹果公司的文档:

要高效地更新activity对象的userInfo字典,请配置其委托,并在每次需要更新userInfo时将其needsSave属性设置为YES。在适当的时候,Handoff调用委托的userActivityWillSave: callback,并且委托可以更新活动状态。

这不是“最佳实践”,它是必需的!

注意:在运行基于Xcode6.x构建的代码的iOS 9设备上出现问题。还没有测试Xcode7,问题可能不会出现在iOS 8上。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26715531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档