有没有办法在不使用插座的情况下更新 NSTextField 标签的 stringValue?
Is there a way to update an NSTextField label's stringValue without using an outlet?
所以我是 Cocoa 和 Objective-C 编程的新手,但我已经阅读了足够多的内容,能够修改我正在编写的这个程序,几乎完全令我满意。 .除了一个特定的用例。
该程序允许用户手动指定他们希望下载的文件所在的路径,然后通过将标签的值绑定到用户默认控制器将其保存到用户默认字典中。然后通过附加到 'Open in Finder' 按钮的 IBAction 更新标签的 stringValue(通过修改 Push 按钮的 IBAction 中的 label outlet 的 stringValue),只要用户单击按钮并选择新路径就会触发。
我的问题是,当下载文件时,如果用户选择的路径不再存在或无效,它将默认到用户的桌面。但在这种情况下,我看不到标签中反映的桌面路径。这也是有道理的,因为在这种情况下没有代码可以直接修改标签的字符串值(无法从该文件访问标签的出口)。我一直在尝试想出一个解决方案来解决这个困扰我的小问题,但我还没有找到有效的解决方案。非常欢迎任何建议或提示!我在下面包含了我的代码的相关片段的片段。
"PreferencesController.m"
- (IBAction)onOpenDownloadsPath:(id)sender {
NSOpenPanel* panel = [NSOpenPanel openPanel];
[panel setCanChooseFiles:NO];
[panel setCanChooseDirectories:YES];
[panel setAllowsMultipleSelection:NO];
[panel beginWithCompletionHandler:^(NSInteger result){
if (result == NSFileHandlingPanelOKButton) {
NSURL* theDir = [[panel URLs] objectAtIndex:0];
NSString* thePath = theDir.path;
[Preferences setDownloadsPath:thePath];
self->_labelDisplay.stringValue = [Preferences getDownloadsPath];
}
}];}
"Preferences.m"
+ (void)setDownloadsPath:(NSString *)value {
NSUserDefaults* ud = [NSUserDefaults standardUserDefaults];
[ud setObject:value forKey:@"Preferences.downloadsPath"];
}
+ (NSString*)getDownloadsPath {
NSUserDefaults* ud = [NSUserDefaults standardUserDefaults];
return [ud stringForKey:@"Preferences.downloadsPath"];
}
已解决。我使用 NSNotification observer/listener 来监听何时调用 set 函数,然后相应地更新标签中的 stringValue。
所以我是 Cocoa 和 Objective-C 编程的新手,但我已经阅读了足够多的内容,能够修改我正在编写的这个程序,几乎完全令我满意。 .除了一个特定的用例。
该程序允许用户手动指定他们希望下载的文件所在的路径,然后通过将标签的值绑定到用户默认控制器将其保存到用户默认字典中。然后通过附加到 'Open in Finder' 按钮的 IBAction 更新标签的 stringValue(通过修改 Push 按钮的 IBAction 中的 label outlet 的 stringValue),只要用户单击按钮并选择新路径就会触发。
我的问题是,当下载文件时,如果用户选择的路径不再存在或无效,它将默认到用户的桌面。但在这种情况下,我看不到标签中反映的桌面路径。这也是有道理的,因为在这种情况下没有代码可以直接修改标签的字符串值(无法从该文件访问标签的出口)。我一直在尝试想出一个解决方案来解决这个困扰我的小问题,但我还没有找到有效的解决方案。非常欢迎任何建议或提示!我在下面包含了我的代码的相关片段的片段。
"PreferencesController.m"
- (IBAction)onOpenDownloadsPath:(id)sender {
NSOpenPanel* panel = [NSOpenPanel openPanel];
[panel setCanChooseFiles:NO];
[panel setCanChooseDirectories:YES];
[panel setAllowsMultipleSelection:NO];
[panel beginWithCompletionHandler:^(NSInteger result){
if (result == NSFileHandlingPanelOKButton) {
NSURL* theDir = [[panel URLs] objectAtIndex:0];
NSString* thePath = theDir.path;
[Preferences setDownloadsPath:thePath];
self->_labelDisplay.stringValue = [Preferences getDownloadsPath];
}
}];}
"Preferences.m"
+ (void)setDownloadsPath:(NSString *)value {
NSUserDefaults* ud = [NSUserDefaults standardUserDefaults];
[ud setObject:value forKey:@"Preferences.downloadsPath"];
}
+ (NSString*)getDownloadsPath {
NSUserDefaults* ud = [NSUserDefaults standardUserDefaults];
return [ud stringForKey:@"Preferences.downloadsPath"];
}
已解决。我使用 NSNotification observer/listener 来监听何时调用 set 函数,然后相应地更新标签中的 stringValue。