我刚刚使用新的 iOS 13 完成了 CoreData+CloudKit 的设置NSPersistentCloudKitContainer
。它工作得非常好,因为我可以使用自动生成的 CoreData 类进行属性访问和本地存储,并NSPersistentCloudKitContainer
自动同步设备之间的更改。我遇到的问题是收到远程更改的通知。我检查了苹果的文档和这个国家,你告诉NSPersistentCloudKitContainer
的NSPersistentStoreDescription
您希望它发送通知,然后将其他对象注册为该通知的观察者。我已经这样做了并添加了一个测试方法来显示检测到远程更改的时间。测试方法生成的警报永远不会生成,但是如果我杀死应用程序并重新打开它,更改就会立即出现。所以我相信远程更改正在同步并集成到本地 CoreData 存储中,但通知不起作用。我已将Background Modes
权利添加到我的目标并选择了Remote notification
模式。代码如下。任何帮助将不胜感激!
设置发送通知的选项:
- (NSPersistentCloudKitContainer *)persistentContainer {
// The persistent container for the application. This implementation creates and returns a container, having loaded the store for the application to it.
@synchronized (self) {
if (_persistentContainer == nil) {
_persistentContainer = [[NSPersistentCloudKitContainer alloc] initWithName:@"<redacted>"];
[_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription *storeDescription, NSError *error) {
if (error != nil) {
// ...
}
else …
Run Code Online (Sandbox Code Playgroud) 我正在尝试向 macOS 应用程序添加登录项。该应用程序在其 plist 中设置为代理,因此它没有停靠栏图标,在启动时隐藏其主窗口,并在状态栏中放置一个图标以提供其 UI。
要添加登录项,我有:
Strip Debug Symbols During Copy
在基本应用程序中禁用Copy Files
向基本应用程序添加了一个阶段,目标设置为Wrapper
,子路径设置为Contents/Library/LoginItems
,并将辅助应用程序添加到要复制的文件列表中Skip Install
为助手应用启用applicationDidFinishLaunching
启动基础应用程序SMLoginItemSetEnabled((__bridge CFStringRef)@"com.mydomain.MyApp-Helper", enabled)
以允许切换登录项问题是,虽然我从SMLoginItemSetEnabled
成功的应用程序中获得反馈,但帮助应用程序在登录时不会运行,或者如果它运行,它不会启动基础应用程序。
我查看了基本应用程序包的内部,帮助应用程序就在那里。我可以手动运行它,它会启动基本应用程序。我什至可以通过“系统偏好设置”手动将其添加为登录项,但它仍会启动基本应用程序。所以看起来即使SMLoginItemSetEnabled
正在返回true
,它实际上并没有安装登录项。或者,如果是,它无法从登录项启动和运行基本应用程序,即使我手动执行它也可以。
我已将类别方法添加到NSUserDefaults中以存储和检索编码的对象(在本例中为NSArray)。我在检索编码数据时遇到问题。这是我的代码:
- (void)encodeObject:(id<NSCoding>)object forKey:(NSString *)key {
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:object requiringSecureCoding:NO error:nil];
[self setObject:data forKey:key];
[self synchronize];
}
- (id)decodeObjectForKey:(NSString *)key class:(Class)aClass {
NSData *data = [self objectForKey:key];
NSError *error = nil;
id object = [NSKeyedUnarchiver unarchivedObjectOfClass:aClass fromData:data error:&error];
NSLog(@"E: %@ %@", error.localizedDescription, object);
return object;
}
Run Code Online (Sandbox Code Playgroud)
调用[[NSUserDefaults standardDefaults] encodeObject:object forKey:key]
应对传递的对象进行编码并将其存储为默认值,然后调用[[NSUserDefaults standardDefaults] decodeObjectForKey:key class:aClass
应返回编码的对象。
问题是[NSKeyedUnarchiver unarchivedObjectOfClass:fromData:error:]
返回nil
,错误文本记录为The data couldn’t be read because it isn’t in the correct format.
。使用检索的数据[self objectForKey:] …
我有一个 UITableView 有一个部分和足够的行,tableView 需要滚动到底部。我想添加一个页脚视图,它会粘在 tableView 的底部并且始终可见,所以我实现了 viewForFooterInSection。这是我的代码:
- (UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
NSLog(@"Get footer view");
if (tableView == [self tableView]) {
return [self footerRowRightView];
}
else if (tableView == [self fixedColumnTableView]) {
return [self footerRowLeftView];
}
return nil;
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是页脚视图仅在 tableView 滚动后才显示,但我希望它从一开始就可见(即无论用户是否滚动始终浮动)。
一旦控制器出现并且 tableView 加载其数据,我就会在日志中看到“获取页脚视图”,所以我知道 viewForFooterInSection 正在被立即调用。我无法解决的是为什么它没有立即显示,以及如何让它这样做。
在此先感谢您的帮助!
ios ×3
cloudkit ×1
core-data ×1
footer ×1
macos ×1
nscoding ×1
objective-c ×1
tableview ×1
uitableview ×1