有没有办法在不使用插座的情况下更新NSTextField标签的stringValue?

时间:2019-12-18 06:19:59

标签: objective-c macos interface-builder nstextfield cocoa-bindings

因此,我是Cocoa和Objective-C编程的新手,但我已经读了足够的书,可以修改我正在开发的这个程序,几乎完全令我满意...除了一种特殊用途外情况。

该程序允许用户手动指定希望下载文件驻留的路径,然后通过将标签的值绑定到用户默认值控制器将其保存到用户默认值字典中。然后,通过附加到“在查找器中打开”按钮上的IBAction(通过在按钮的IBAction内修改标签出口的stringValue)来更新标签的stringValue(每当用户单击按钮并选择新路径时都会触发该标签)。

我的问题是,下载文件时,如果用户选择的路径不再存在或无效,它将默认为用户的桌面。但是在这种情况下,我看不到标签中反映了桌面路径。这也很有意义,因为在这种情况下,没有代码可直接修改标签的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"];
    }

1 个答案:

答案 0 :(得分:0)

已解决。我使用NSNotification观察器/侦听器侦听何时调用set函数,然后相应地更新了标签中的stringValue。