当设置改变时,如何重新加载UISplitViewController对象



我看过Apple appPrefs代码示例,但这似乎只适用于导航控制器。我正在使用一个iPad UISplitViewController,它有简单的根和详细的vc。

我可以更改某些设置(颜色,日期格式等),但目前,我必须重新启动应用程序,以使更改生效。我不希望重新启动应用程序。

我使用的是每次应用程序启动时加载设置的系统。我可以让通知系统工作,但我不知道如何重载视图控制器。

有什么想法吗(我猜是重新加载视图)

谢谢你的提示/建议。我可以张贴一些代码,如果相关的

  • 如果您使用settings bundle to manage preferences from the Settings app:

    从你在问题中所说的,你已经知道如何获得通知(UIApplicationDidBecomeActiveNotification)当你的应用程序变得活跃,对吗?

    如果是这样,剩下的唯一问题是如何在收到通知后重新加载视图。除了UITableView,它可以通过调用[tableView reloadData]轻松地重新加载,您必须通过将值赋给您想要重新加载的UI控件来重新加载视图,就像您最初设置它们一样。假设你有一个UILabel标签,你想用新设置的偏好值重新加载,你只需要写这样的代码:

    - (void)reloadView {
        label.text = [[NSUserDefaults standardUserDefaults] stringForKey:@"PreferenceKey"];
        self.view.background = …
        [self.tableView reloadData];
    }
    - (void)reloadViewOnAppActivation:(NSNotification *)notif {
        [self reloadView];
    }
    
  • 如果您正在使用in app preferences setting:

    1. 如果preferences视图控制器没有与SplitViewController同时显示。在控制器的viewWillAppear:方法中重新加载视图:

      - (void)viewWillAppear:(BOOL)animated {
          [super viewWillAppear:animated];
          [self reloadView]; // See the definition of reloadView above
      }
      
    2. 否则,将SplitViewController作为preferences视图控制器的委托,或者将其分配给一个变量,并在适当的时候通知它preferences的变化-如果您喜欢实时更新,则在更改任何单个首选项之后立即通知它,或者如果您喜欢批量更新,则在所有更改完成后通知它:

      // SplitViewController methods:
      - (void)preferencesAreChanged {
          [self reloadView]; // See the definition of reloadView above
      }
      // Preferences view controller methods:
      // Immediate update, use a preference controlled by a `UISegmentedControl` as an example
      - (void)viewDidLoad {
          [super viewDidLoad];
          …
          [segmentedControl addTarget:self action:@selector(xPreferenceTogglingAction:) forControlEvents:UIControlEventValueChanged];
          …
      }
      - (IBAction)xPreferenceTogglingAction:(id)sender {
          // Update the x preference.
          …
          [delegate preferencesAreChanged];
      }
      // Batch update
      - (void)viewWillDisappear:(BOOL)animated {
          [delegate preferencesAreChanged];
          [super viewWillDisappear:animated];
      }
      

所以,为了帮助别人,我将发布我是如何(在苹果的帮助下)解决这个问题的。

在根视图控制器和细节视图控制器中,我添加了基于用户设置的样式:

"暖色调","冷色调","皮革"等。这些转换成这样的代码:

switch (styleKey) {
        case 0: // BASIC
            fontName = @"Copperplate"; 
            fontSize = 16;
            selectedBarColor = [UIColor lightGrayColor];
            selectedTintColor = [UIColor lightGrayColor];
            selectedFontColor = [UIColor darkGrayColor];
            backgroundColor = [UIColor whiteColor];
            selectedHighlightColor = UITableViewCellSelectionStyleGray;
            backgroundImage = nil;
            detailBackgroundImage = nil;
            break;

然后,每当调用颜色/样式/字体时,我使用如下代码:

cell.selectionStyle = selectedHighlightColor;
cell.backgroundColor = backgroundColor;

这允许我更改设置和样式,但我仍然必须每次重新启动应用程序才能看到更改。

解决方法很简单。

设置样式改变了常量的值(例如fontColor) -但我实际上并没有改变字段。

所以在switch语句的末尾,我添加了这样的东西:

self.tableView.backgroundColor = backgroundColor;
self.navigationController.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:backgroundImage]];
self.navigationController.navigationBar.tintColor = selectedBarColor;
self.tableView.separatorColor = selectedTintColor;

我必须在两个视图控制器中都这样做

而且,所有这些代码都是例程(changessettings)的一部分。

这个方法正在被观察以查找更改。

我处理应用内偏好的方式是使用很棒的InAppSettingsKit。

我希望这有助于别人。我想你们中的大多数人会觉得这很简单,但是——我的脑子已经不多了——我花了两周时间才弄明白。

最新更新