Проблемы при перезагрузке представлений в NSBox

У меня проблема при перезагрузке просмотров. OSX не так прост, как IOS.

В MainMenu.xib у меня есть NSBox. Согласно Hillegrath, несколько видов сохраняются в массиве, и когда нажимается сегментированная кнопка, они открываются. Это работает правильно. Мое разочарование связано с пересмотром этих представлений, когда были внесены изменения, которые должны заставить их заново отображать новые значения через [self someAction]. Действия в двух представлениях изменяют (глобальные) значения, которые должны распространяться на изменения в других представлениях. Я использую контроллер окна w/xib (MainMenu), чтобы удерживать поле, содержащее представления. Я также называю взгляды в коде.

Глобальные значения ivar меняются должным образом, когда это необходимо, и журнал показывает это. Однако зависимые операции не выполняются при повторном просмотре представления, т. Е. Обновляются особенности представления.

Кажется, что происходит то, что loadView не вызывается, когда отображаются различные представления, ** **. awakeFromNib и loadView работают правильно, когда каждый вид отображается в первый раз, но не при повторном отображении. Это подразумевает, что это представление может быть скрыто, но viewDidUnhide не имеет никакого эффекта.

Код изменения представления (из ответа SO MVC и Hillegrath):

 NSViewController *activeVC =
        (NSViewController *) self.viewControllers[index];
   // [_box setContentView:nil];
    [_box setContentView:activeVC.view];
    [_box setNeedsDisplay:YES];

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

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

Спасибо

1 ответ

Похоже, вы путаете загрузку представления с дисплеем. -awakeFromNib принимается объектом файла пера только при загрузке файла пера. Так же, -loadView принимается контроллером представления только при загрузке соответствующего файла пера. Так как ваши контроллеры представлений хранятся в массиве, эти контроллеры представлений не освобождаются, поэтому их соответствующие nib-файлы никогда не выгружаются, пока массив жив. Это разумное поведение, но вы должны иметь в виду, что -awakeFromNib а также -loadView в этом случае выполняются только один раз, потому что загрузка пера выполняется только один раз.

Так как кажется, что вы вручную заполняете представление в -loadViewвам также придется делать это всякий раз, когда вы устанавливаете это представление как представление содержимого блока (при условии, что вы не всегда обновляете представление всякий раз, когда изменяется модель). Например, вы могли бы иметь -reloadData метод в вашем контроллере представления и оба -loadView и метод обмена представлением содержимого вашего ящика будет использовать -reloadData,

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

Для записи, -[NSBox setContentView:] помечает поле для повторного отображения, поэтому вам не нужно отправлять его -setNeedsDisplay:YES,

(и убедитесь, _box на самом деле указывает на NSBox пример)

Другие вопросы по тегам