iOS: невозможно скрыть вид после его скрытия - PullRequest
0 голосов
/ 05 декабря 2011

У меня есть индикатор активности и прозрачный черный слой за ним.Когда что-то загружается, я показываю их так:

[activityIndicator startAnimating];
loadingCover.hidden = NO;

И когда я скрываю их, я просто делаю это так:

[activityIndicator stopAnimating]; //hides on stop
loadingCover.hidden = YES;

Пока все работает.Но почему-то, если я хочу показать их снова, это не сработаетЕсть идеи?

РЕДАКТИРОВАТЬ: Вот как я это делаю ...

- (void)viewDidLoad {
    [mainView addSubview:loadingCover]; //works
}

- (void)parserDidEndDocument:(NSXMLParser *)parser {
    [loadingCover removeFromSuperview]; //works
}

- (void)refreshRSS:(id)sender {
    [mainView addSubview:loadingCover]; //doesn't work
}

РЕДАКТИРОВАТЬ2: Во-первых, я кодирую с режимом ARC и второй,loadingCover был изменен на loadingplate, нет, biggie ...

Хорошо, поэтому в моем файле .h я делаю это:

UIView *loadingplate;
UIActivityIndicatorView *loadingIndicator;

И в моем файле .m в viewDidLoad я делаю это:

CGRect viewRect = CGRectMake(0, 0, 320, 460);
loadingplate = [[UIView alloc] initWithFrame:viewRect];

UIColor *loadingplateColor = [[UIColor alloc] initWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];
[loadingplate setBackgroundColor:loadingplateColor];
loadingplate.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleBottomMargin;

loadingIndicator = [[UIActivityIndicatorView alloc] initWithFrame:viewRect];
[loadingIndicator setContentMode:UIViewContentModeCenter];
[loadingIndicator startAnimating];

loadingIndicator.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleBottomMargin;

[loadingplate addSubview:loadingIndicator];
[mainView addSubview:loadingplate];

EDI3: Прочитав ответ Джасариена, я попробовал это в своем файле .h:

@property (strong, nonatomic) UIView *loadingPlate;

А затем в своем файле .m:

@synthesize loadingPlate = _loadingPlate;

В этом файле viewDidLoad я создаю представление.

Но, похоже, это тоже не работает.

Ответы [ 6 ]

3 голосов
/ 09 декабря 2011

Пожалуйста, смотрите комментарий XJones.Этот ответ, вероятно, неправильный.

После отредактированного вопроса:

Похоже, что, поскольку вы используете дугу, ваше представление loadingPlate, вероятно, будет выпущено слишком рано.

Когда вы выделяете и инициализируете свой loadingPlate просмотр, он будет иметь счетчик +1, как и ожидалось от alloc / init.Тем не менее, поскольку вы используете ARC, после того, как вы добавите его в качестве подпредставления вашего основного представления, ARC выпустит его.Фактически представление loadingPlate принадлежит его суперпредставлению, и когда вы удаляете его из суперпредставления, суперпредставление освобождает его, в результате чего представление освобождается.Таким образом, когда вы пытаетесь показать его снова, его там больше нет и не может быть показано.

Решением этой проблемы было бы создание свойства для вашего loadingPlate представления и присвоение ему 'strong'ссылка, (фактически то же самое, что объявление свойства как «сохранить»).Таким образом, объект, обладающий этим свойством, будет иметь представление loadingPlate, сохраняя строгую ссылку на него.

1 голос
/ 16 декабря 2011

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

  1. Вам не нужна недвижимость.Что касается сохранения семантики, iVars по умолчанию strong.Если вы создаете свойство и синтезируете его так, как показывает, то обязательно обращайтесь к self.loadingPlate или _loadingPlate в своем коде.

  2. Убедитесь, что у вас нетопечатка в вашем имени iVar против вашего свойства.Например, если у вас есть iVar с именем loadingplate, но ваше свойство равно loadingPlate, вы получите два iVar (loadingplate и loadingPlate), поскольку свойства автоматически создают iVar, если они не совпадают с уже определенными.

  3. Ваша логика создания loadingPlate представления в viewDidLoad и добавления / удаления его из суперпредставления по мере необходимости полностью подходит.Просто убедитесь, что у вас нет loadingPlate = nil нигде, кроме как в viewDidUnload.

  4. Если есть возможность изменить размер кадра суперпредставления, вы должны явно установить loadingPlate.frame = mainView.bounds перед добавлениемloadingView в качестве подпредставления.Если кадры не меняются, это не имеет значения.

Если я что-нибудь еще придумаю, я добавлю это позже.Удачи.

1 голос
/ 10 декабря 2011

Попробуйте перенести распределение и инициализацию этого представления в метод init. Кроме того, когда вы вызываете метод, чтобы добавить его снова, вы можете просто попробовать проверить, существует ли он первым, вероятно, с помощью:

if (!loadingPlate) {
// allocate and initialize again because somehow it has been released.
}

По крайней мере, таким образом вы узнаете, сохраняется ли экземпляр loadPlate.

1 голос
/ 05 декабря 2011

Вы говорите, что loadingCover.hidden = НЕТ не работает? Вы добавили представление как подпредставление в текущее представление показа?

0 голосов
/ 16 декабря 2011

Разве вам не нужно использовать self.loadingplate, чтобы назвать свойство сильным и сохранить его на ваш взгляд?

0 голосов
/ 09 декабря 2011

Вы уверены, что loadingCover по-прежнему не имеет свойства hidden, установленного на YES с предыдущего отображенного времени?

Попробуйте:

- (void)refreshRSS:(id)sender {
    loadingCover.hidden = NO;
    [mainView addSubview:loadingCover]; //doesn't work
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...