我有一个符合多种协议的Objective-C变量.
id <NSObject, NSCopying, NSCoding> identityToken;
Run Code Online (Sandbox Code Playgroud)
我如何在Swift中表示这种类型?
我正在尝试使用故事板和新的NSTabViewController类为我的应用程序创建一个首选项面板.
我可以让它工作,但故事板中的转换设置似乎被忽略了.它只是从一个标签跳到下一个标签,窗口的大小瞬间变化.
我认为这可能取决于我是否使用autolayout,但是当我切换它时它似乎没有改变过渡行为.
我还检查了"传播标题"设置.我原本以为它将采用标签项的标签或视图控制器的标题,并将其作为窗口标题传播,但似乎并没有这样做.
有人这个上班吗?
这是我正在测试的简单示例应用程序:https://www.dropbox.com/s/roxaplxy5gtlqns/Again.zip?dl = 0
更新:感谢Pierre的工作.通过继承NSTabViewController,结束了一个很好的转换首选项窗口,如下所示:
@implementation MCPreferencesTabViewController
-(void)tabView:(NSTabView *)tabView willSelectTabViewItem:(NSTabViewItem *)tabViewItem
{
[super tabView:tabView willSelectTabViewItem:tabViewItem];
NSTabViewItem *currentTabItem = tabView.selectedTabViewItem;
currentTabItem.view.hidden = YES;
tabViewItem.view.hidden = YES;
NSWindow *window = self.view.window;
NSSize contentSize = tabViewItem.view.fittingSize;
NSSize newWindowSize = [window frameRectForContentRect:(CGRect){CGPointZero, contentSize}].size;
NSRect frame = [window frame];
frame.origin.y += frame.size.height;
frame.origin.y -= newWindowSize.height;
frame.size = newWindowSize;
[self.view.window setFrame:frame display:NO animate:YES];
}
- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
{
[super tabView:tabView didSelectTabViewItem:tabViewItem];
tabViewItem.view.hidden = NO;
}
@end
Run Code Online (Sandbox Code Playgroud) 几年前,Apple发布了Core Data应用程序的iCloud同步.然后我使用新的Apple机制发布了一个带有共享模型的iPad/iPhone/MAC应用程序.事情没有像预期的那样发生.同步机制有时不起作用.例如,在我的情况下,最近几个月很少通过我的3台设备完成同步.一般上传对象工作正常.但新的或删除的对象的下载过程正常崩溃.Apple前段时间发布了一种方法来强制设备重新下载模型的所有对象(NSPersistentStoreRebuildFromUbiquitousContentOption),这些对象正常工作,但这不是一个可接受的解决方案.
我的问题:是否有人完成了让iCloud + Core Data正常工作?如何在iOS 9 + El capitan下运行iCloud + CD,有什么经验吗?
我正在评估迁移到新的CloudKIT API,但我不喜欢在设备离线时自我管理对象上传的想法.指示模型更改的推送通知的新机制是否正常工作?
谢谢
考虑以下简单实体模型:实体A与实体B的一对一关系称为b.实体B具有称为a的反向关系.两种关系都不是可选的.
A B
b < ----- > a
Run Code Online (Sandbox Code Playgroud)
假设我们有两个设备(1)和(2)开始完全同步.每个都有一个A类对象和一个B类对象,它们彼此相关联.在设备1上,我们有对象A1和B1,在设备B上我们有相同的逻辑对象A1和B1.
现在假设在每个设备上进行了模拟更改:
在设备1上,我们删除B1,插入B2,并将A1与B2关联.然后保存更改.
在设备2上,我们删除B1,插入B3,并将A1与B3关联.然后保存更改.
设备1现在尝试从设备2导入事务日志.将插入B3,并且A1将与B3关联.到目前为止好,但B2,现在只剩下关系一个等于零.的一个关系是非可选的,所以发生验证错误.
设备2上会出现类似的情况,因为有两个B对象,并且只有一个A对象要关联.因此必须始终存在验证错误,因为B对象中的一个必须具有设置为nil 的关系.
更糟糕的是,任何未来的更改都会留下错误的B对象,因此验证失败.实际上,用户无法通过重置关系来自行解决问题.它永久地被打破了.
问题是,如何解决这样的验证错误?这一切都发生在NSPersistentStoreDidImportUbiquitousContentChangesNotification触发通知之前.它不是应用程序main NSManagedObjectContext中的验证错误,它是在将事务日志初始导入持久性存储期间发生的验证错误.
我能想到的唯一选择可能是尝试删除自定义setter(setA:)中的无效B对象,或者validateA:error:B类本身上的KVC验证方法(),因为这些似乎在事务日志导入期间被触发.但我不确定是否允许这样的副作用,当我尝试它时,它确实会导致令人讨厌的日志消息.
任何人都知道处理这个问题的正确方法是什么?