我正在使用 NSUSerDefaults 为我的应用程序存储几个字符串和整数。每当打开 View 时,字符串的加载速度都比 View 慢,因此您会看到一个故障。例如,我保存了 selectedSegmentIndex,然后在 viewDidAppear 中读取它,在调用 View 时的一瞬间,没有选择段,然后选择了正确的段。您如何做到这一点,以便在打开 View 和读取设置之间没有时间间隔?
- (void)viewDidLoad
{
[super viewDidLoad];
int segmentIndex = [[NSUserDefaults standardUserDefaults] integerForKey:@"selectedIndex"];
unitSegmentControl.selectedSegmentIndex = segmentIndex;
BOOL location = [[NSUserDefaults standardUserDefaults] boolForKey:@"locationManager"];
[gpsSwitch setOn:location animated:NO];
deviceID.text = [[NSUserDefaults standardUserDefaults] stringForKey:@"DeviceID"];
}
- (IBAction)changeSeg:(id)sender {
if (unitSegmentControl.selectedSegmentIndex == 0) {
[[NSUserDefaults standardUserDefaults] setObject:@"http://98.246.50.81/firecom/xml/units/E01.xml" forKey:@"parserURL"];
[[NSUserDefaults standardUserDefaults] setObject:@"Hillsboro Main" forKey:@"selectedStation"];
[[NSUserDefaults standardUserDefaults] setObject:@"Hillsboro Fire & Rescue" forKey:@"selectedDepartment"];
}
if (unitSegmentControl.selectedSegmentIndex == 1) {
[[NSUserDefaults standardUserDefaults] setObject:@"http://98.246.50.81/firecom/xml/units/E02.xml" forKey:@"parserURL"];
[[NSUserDefaults standardUserDefaults] setObject:@"Hillsboro Witch Hazel" forKey:@"selectedStation"];
[[NSUserDefaults standardUserDefaults] setObject:@"Hillsboro Fire & Rescue" forKey:@"selectedDepartment"];
}
[[NSUserDefaults standardUserDefaults] setInteger:unitSegmentControl.selectedSegmentIndex forKey:@"selectedIndex"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
最佳答案
默认值并不慢,你只是加载数据太迟了。填充 View 的标准位置是在 View Controller 中的 -viewDidLoad
或 -viewWillAppear
中。两者都会尽快更新 View 以避免视觉故障。如果两者中的任何一个都不适合您,请引用以下提示来找出原因:
- 尝试将所选索引设置为固定编号。这将告诉您问题是出在默认值中还是(更有可能)在
-setSelectedSegmentIndex
调用中。 - 将 UI 填充代码移至
-viewWillAppear
。这是在显示之前更新 UI 的最新时刻。 - 使用
NSParameterAssert
确保unitSegmentControl
不是nil
。 确保从默认值中读回的索引是预期的数字。通常,最好将默认键拉入常量。这样你就不会遇到简单的拼写错误:
static NSString *const SelectedSegmentKey = @"selectedSegment";
如果一切都失败了,请为您的
unitSegmentControl
使用自定义UISegmentControl
子类,并在-setSelectedSegmentIndex
中放置一个断点以查看谁否则可能会调用它。
关于iOS NSUserDefaults 加载缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13996159/