Как перезагрузить объект UISplitViewController, когда настройки изменились? - PullRequest
1 голос
/ 30 декабря 2011

Я посмотрел пример кода Apple appPrefs, но, похоже, он предназначен только для контроллеров навигации. Я работаю с iPad UISplitViewController, который имеет простые корневые и подробные VC.

Я могу изменить некоторые настройки (цвета, форматы даты и т. Д.), Но в настоящее время мне необходимо перезапустить приложение, чтобы изменения вступили в силу. Я бы предпочел не перезапускать приложение.

Я использую систему загрузки настроек при каждом запуске приложения. Я могу заставить работать систему уведомлений, но я не знаю, как перезагрузить контроллеры представления.

Любые идеи, как это сделать (я думаю, как-то перезагрузить представления).

Спасибо за любые советы. Я могу опубликовать код, если уместно.

Ответы [ 2 ]

2 голосов
/ 06 января 2012
  • Если вы используете settings bundle to manage preferences from the Settings app:

    Из того, что вы сказали в своем вопросе, вы уже знаете, как получить уведомление (UIApplicationDidBecomeActiveNotification), когда ваше приложение станет активным, верно?

    Если это так, осталась только одна проблема - как перезагрузить представление после получения уведомления.Помимо UITableView, который может быть легко перезагружен путем вызова [tableView reloadData], вам необходимо перезагрузить представление, назначив значения элементам управления пользовательского интерфейса, которые вы хотите перезагрузить, так же, как вы их изначально настраивали.Скажем, у вас есть метка 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. Если контроллер представления предпочтений не отображается одновременно с SplitViewController.Перезагрузите ваши представления в методах viewWillAppear: их контроллеров:

      - (void)viewWillAppear:(BOOL)animated {
          [super viewWillAppear:animated];
          [self reloadView]; // See the definition of reloadView above
      }
      
    2. В противном случае, сделайте SplitViewController делегатом или назначьте его на ivar of, контроллера представления предпочтений, иуведомить его об изменениях предпочтений, когда это необходимо - сразу после изменения любого отдельного предпочтения, если вы предпочитаете обновление в реальном времени, или после того, как все изменения сделаны, если вы предпочитаете пакетное обновление:

      // 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];
      }
      
1 голос
/ 06 января 2012

Итак, чтобы помочь другим, я опубликую, как я (с помощью Apple) решил эту проблему.

В контроллерах как корневого, так и подробного просмотра я добавил стили, основанные на пользовательских настройках:

"Теплые тона", "Прохладные тона", "Кожа" и т. Д. Они переводятся в код, подобный следующему:

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;

Я должен был сделать это в обоих контроллерах представления.

Кроме того, весь этот код был частью подпрограммы (changeSettings).

Этот метод наблюдается для поиска изменений.

То, как я обрабатывал внешний вид предпочтений в приложении (модальный ВК), заключалось в использовании потрясающего InAppSettingsKit .

Надеюсь, это поможет другим. Я полагаю, что большинство из вас найдет это легким делом, но, если у меня осталось мало мозгов, мне потребовалось две недели, чтобы понять это.

...