You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NSPopUpButton重启程序后无法显示上次保存的选中项

解决NSPopUpButton重启后无法恢复选中项的问题

你已经实现了菜单的显示、选中和保存功能,重启前关闭再打开偏好窗口能正常恢复选中项,但程序重启后不行——核心原因是windowDidLoad方法只负责添加菜单选项,没有读取之前保存的偏好值并设置对应的选中状态,所以每次重启都会默认显示第一项。

直接修改PreferenceController.m的windowDidLoad方法,在所有菜单选项添加完成后,加入恢复选中状态的逻辑:

- (void)windowDidLoad
{
    NSDictionary *environment = [[NSProcessInfo processInfo] environment];
    NSString *commonlist = @"/bin/powerpc-apple-darwin:/usr/X11R6/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/sw/bin:/sw/sbin:/opt/local/bin";  // Added /opt/local/bin
    NSString *pathlist = [environment objectForKey:@"PATH"];
    NSArray *commonItems = [commonlist componentsSeparatedByString:@":"];
    NSArray *pathItems = [pathlist componentsSeparatedByString:@":"];
    NSString *path;
    BOOL duplicate;
    unsigned int i, h;

    for (i = 0; i < [commonItems count]; i++)
    {
        path = [[commonItems objectAtIndex:i] stringByAppendingString:@"/lame"];
        if ([[NSFileManager defaultManager] fileExistsAtPath:path])
            [versionsPopupOutlet addItemWithTitle:path];
    }

    for (i = 0; i < [pathItems count]; i++)
    {
        duplicate = FALSE;
        for (h = 0; h < [commonItems count]; h++)
        {
            if ([[pathItems objectAtIndex:i] isEqualToString:[commonItems objectAtIndex:h]])
                duplicate = TRUE;
        }
        if (!duplicate)
        {
            path = [[pathItems objectAtIndex:i] stringByAppendingString:@"/lame"];
            if ([[NSFileManager defaultManager] fileExistsAtPath:path])
                [versionsPopupOutlet addItemWithTitle:path];
        }
    }

    // 新增:读取保存的路径并设置选中项
    NSString *savedLamePath = [[NSUserDefaults standardUserDefaults] objectForKey:@"lamePath"];
    if ([savedLamePath isEqualToString:@""]) {
        // 空字符串对应选中第一项(和你的保存逻辑一致)
        [versionsPopupOutlet selectItemAtIndex:0];
    } else {
        // 根据保存的路径找到对应的菜单选项
        NSMenuItem *targetItem = [versionsPopupOutlet itemWithTitle:savedLamePath];
        if (targetItem) {
            [versionsPopupOutlet selectItem:targetItem];
        } else {
            // 如果保存的路径不在当前菜单中(比如文件被删除),默认选中第一项
            [versionsPopupOutlet selectItemAtIndex:0];
        }
    }
}

关键细节说明

  1. 必须等所有菜单选项添加完成后再设置选中项,否则会找不到对应的选项。
  2. 完全匹配你原有的保存逻辑:选中第一项时存储空字符串,恢复时遇到空字符串就选中第一项。
  3. 增加了容错处理:如果保存的路径对应的lame文件在重启后不存在(导致菜单里没有这个选项),会自动 fallback 到选中第一项,避免界面异常。

内容的提问来源于stack exchange,提问作者RobK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:10:49