2

我正在使用 NSUSerDefaults 为我的应用程序存储几个字符串和整数。每当打开视图时,字符串的加载速度都会比视图慢,因此您会看到故障。例如,我保存 selectedSegmentIndex,然后在 viewDidAppear 中读取它,当视图被调用时,没有选择任何段,然后选择正确的段。您如何做到这一点,以便在打开视图和读取设置之间没有时间间隔?

- (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];
}
4

1 回答 1

3

默认值并不慢,只是加载数据太晚了。填充视图的标准位置是在视图-viewDidLoad-viewWillAppear控制器中。两者都将尽快更新视图以避免视觉故障。如果这两种方法中的任何一种都不适合您,这里有一些提示可以找出原因:

  • 尝试将选定的索引设置为硬连线数字。这将告诉您问题是在默认情况下还是(更有可能)在-setSelectedSegmentIndex通话中。
  • 将 UI 填充代码移至-viewWillAppear. 这是在 UI 显示之前更新 UI 的最新时刻。
  • 使用NSParameterAssert以确保unitSegmentControl不是nil
  • 确保从默认值读回的索引是预期的数字。通常,最好将默认键拉入常量。这样你就不会碰到简单的错字错误:

    static NSString *const SelectedSegmentKey = @"selectedSegment";
    
  • 如果其他一切都失败了,UISegmentControl请为您使用自定义子类unitSegmentControl并放置一个断点-setSelectedSegmentIndex以查看还有谁可能在调用它。

于 2012-12-21T19:40:15.623 回答