【问题标题】:Using UISegmentedControl to save mapKit preferences with NSUserDefaults - not working correctly使用 UISegmentedControl 通过 NSUserDefaults 保存 mapKit 首选项 - 无法正常工作
【发布时间】:2012-04-19 23:50:12
【问题描述】:

我有一个带有 3 个选项的分段控件,用于在 NSUserDefaults 中保存标准/卫星/混合地图。我遇到的一个问题是,每当重新访问 mapSettingsViewController 时,分段控件就会变回第一段。另一个问题是 mapViewController 不会在 viewWillAppear 上重新加载。

我正在使用带有 Storyboard 的 pageCurl 模态转换 - 不确定这是否重要。

这是设置视图控制器(mapSettingsViewController)中保存分段选择的代码:

    - (IBAction)changeMapType: (id)sender{


    NSInteger index = ((UISegmentedControl*)sender).selectedSegmentIndex;

    // Get the shared defaults object.
    NSUserDefaults *mapUserPreferences = [NSUserDefaults standardUserDefaults];

    if(segmentedControlMapType.selectedSegmentIndex == 0){
        // Save the index.
    [mapUserPreferences setInteger:index forKey:@"mapViewKey"];

    }
    else if(segmentedControlMapType.selectedSegmentIndex == 1){
        // Save the index.
        [mapUserPreferences setInteger:index forKey:@"mapViewKey"];
    }
    else if(segmentedControlMapType.selectedSegmentIndex == 2){
        // Save the index.
        [mapUserPreferences setInteger:index forKey:@"mapViewKey"];

    }

    // Write them to disk
    [mapUserPreferences synchronize];
}

然后在第一个视图控制器 (mapViewController) 中显示对用户选择的段的地图基础的更改。我将代码放在 viewWillAppear 中,这样每次视图出现时都会重新加载地图。

    -(void) viewWillAppear:(BOOL)animated {

    // Get the settings and set the selected index.
    NSUserDefaults *mapUserPreferences = [NSUserDefaults standardUserDefaults];
    if([mapUserPreferences integerForKey:@"mapViewKey"] == 0) {
        mapView.mapType = MKMapTypeStandard;
    }
    if([mapUserPreferences integerForKey:@"mapViewKey"] == 1) {
        mapView.mapType = MKMapTypeSatellite;
    }
    if([mapUserPreferences integerForKey:@"mapViewKey"] == 2) {
        mapView.mapType = MKMapTypeHybrid;
    }

}

感谢您的帮助:)

【问题讨论】:

  • 我在 IB 中将分段控件更改为未选中并且它可以工作。但是地图仍然没有加载到 mapViewController 上的 viewWillAppear 上。您必须离开视图然后返回然后加载。我想知道页面卷曲过渡是否与 viewWillAppear 没有重新加载地图有关......

标签: objective-c ios nsuserdefaults uisegmentedcontrol


【解决方案1】:

要检查,当 modalView (pageCurl) 被解除时,只需将委托方法添加到您的 pageCurl 控制器:

viewWillDisappear:

然后在此处添加地图更新逻辑。

【讨论】:

  • 我确信这是一种方法。我只需要研究它是如何完成的......再次感谢
【解决方案2】:

我不知道你为什么这样做:

if(segmentedControlMapType.selectedSegmentIndex == 0){
// Save the index.
[mapUserPreferences setInteger:index forKey:@"mapViewKey"];

在 IBAction 中,您从 (id)sender 获取事件。

你为什么不直接放:

if((UISegmentedControl*)sender.selectedSegmentIndex == 0)

也许我走错了路,但是您在谈论分段控件的 2 个不同实例对象。

这是什么? 分段控制地图类型

和发件人一样吗?

【讨论】:

  • 好的,谢谢。知道如何在 mapSettingsViewController 上更改分段设置后重新访问 mapViewController 时重新加载它吗?我以为是 viewWillAppear。
  • 是的。我检查了: NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);我在情节提要中使用页面卷曲过渡。如果我从 mapSettingsViewController (页面卷曲)返回到 mapViewController,则地图没有变化。如果我离开 mapViewController 视图然后回来,地图就会正确更改。
  • 因为 viewWillAppear 不会被调用。就像我在下面的帖子中写的那样行事
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 2020-10-11
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
相关资源
最近更新 更多