Подвиды не отображаются при использовании replaceSubview: with: - PullRequest
3 голосов
/ 28 июня 2011

Я пишу приложение динамического мастера, использующее Cocoa / Objective C на OSX 10.6.Приложение проходит через серию представлений, собирая пользовательский ввод по пути.Каждое отображаемое представление предоставляется загружаемым комплектом.Когда приложение запускается, загружается набор пакетов, и, когда контроллер проходит через них, оно запрашивает отображение каждого пакета.Я использую следующее, чтобы оживить переход между представлениями

[[myContentView animator] replaceSubview:[oldView retain] with:newView];

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

Я подумал, что это может быть связано с анимацией, поэтому я попробовал это так*

[myContentView replaceSubview:[oldView retain] with:newView];

с тем же результатом.Есть идеи о том, что здесь происходит?Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 02 сентября 2012

У меня та же проблема, замена Subview не работает. Наконец я нашел что-то не так с моим кодом. так вот правила:

  1. Оба подпредставления должны быть в массиве подпредставлений MyContentview.
  2. OldView должен быть самым верхним подпредставлением в MyContentView, иначе замена не будет иметь места.

вот простая функция для выполнения подуздок

- (void) replaceSubView:(NSView *)parentView:(NSView *)oldView:(NSView *)newView {
    //Make sure every input pointer is not nill and oldView != newView
    if (parentView && oldView && newView && oldView!=newView) {

        //if newview is not present in parentview's subview array
        //then add it to parentview's subview
        if ([[parentView subviews] indexOfObject:newView] == NSNotFound) {
            [parentView addSubview:newView];
        }

        //Note : Sometimes you should make sure that the oldview is the top
        //subview in parentview. If not then the view won't change.
        //you should change oldview with the top most view on parentview

        //replace sub view here
        [parentView replaceSubview:oldView with:newView];
    }
}
1 голос
/ 27 августа 2011

Не думаю, что стоит использовать это [oldView retain]. Это сохранять не имеет смысла. Функция replaceSubview сохранит ее, если это необходимо.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...