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]; } } }
关键细节说明
- 必须等所有菜单选项添加完成后再设置选中项,否则会找不到对应的选项。
- 完全匹配你原有的保存逻辑:选中第一项时存储空字符串,恢复时遇到空字符串就选中第一项。
- 增加了容错处理:如果保存的路径对应的lame文件在重启后不存在(导致菜单里没有这个选项),会自动 fallback 到选中第一项,避免界面异常。
内容的提问来源于stack exchange,提问作者RobK
相关产品推荐
相关产品推荐

