2011-12-30 6 views
1

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

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

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

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

Благодарим за любые советы/рекомендации. Я могу опубликовать код, если это необходимо.

+0

Возможно, я должен перефразировать вопрос - может ли это быть сделано? –

ответ

2
  • Если вы используете 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 делегата, или назначить его Ивар из, предпочтения просмотра контроллера, и уведомить его о предпочтениях меняется при необходимости - сразу после изменения какого-либо одного предпочтения, если вы предпочитаете в обновлении в режиме реального времени, или после того, как все изменения сделаны, если вы предпочитаете пакетное обновление:

      // 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]; 
      } 
      
+0

Наши ответы пересекаются. Я уже назначал ценности - как вы и предполагали. Я видел изменения, когда приложение было перезапущено. Но я не хотел, чтобы приложение перезапускалось каждый раз - я хотел, чтобы пользователи могли видеть изменения «на лету». Поэтому мне пришлось добавить код для перезагрузки элементов стиля, когда уведомление помечено изменением. Я не могу дать вам 50, так как ваш ответ не был полным решением, и я дошел до этого момента, но я буду голосовать за вас за то, что помог мне. Я ценю это. –

+0

Что касается щедрости, все в порядке, я просто хочу помочь. Но я до сих пор не понимаю вашу ситуацию. Вы используете «в настройках предпочтений приложения» или «набор настроек» для управления настройками из приложения «Настройки»? Если первое, у вас есть полный контроль - вы просто перезагружаете свое представление, когда назначаете новое значение предпочтения; если последнее, что я думал, что вы используете, вы всегда вызываете 'UIApplicationDidBecomeActiveNotification', когда возвращаетесь в свое приложение после настройки настроек в приложении« Настройки ». – an0

+0

Я использую прежний .. В настройках приложения .. Как вы предлагаете мне перезагрузить представление? У меня есть стили отсортированы, но не некоторые другие выборы. Я праздновал слишком рано. –

1

Итак, чтобы помочь другим, я опубликую, как я (с помощью 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) - но я фактически не изменял поля.

Таким образом, в конце заявления переключателя, все, что я добавил что-то вроде этого:

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

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

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

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

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

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

Смежные вопросы