Как я могу сохранить свой пользовательский UIView от моей ленивой загрузки Получить аксессуар и назначить его другим представлениям?

StackOverflow https://stackoverflow.com/questions/4221212

Вопрос

Я хочу повторно использовать тот же объект UIView, что и заголовок таблицы в разных UIViewControllers.

У меня есть класс ArticleViewController;

@interface ArticleViewController : UIViewController {
    UIView *headerView;
}

- (UIView *)headerView;

@end

Затем я реализую headerView получить доступ к ленивому нагрузке объекта;

#import "ArticleViewController.h"

@implementation ArticleViewController

- (UIView *)headerView {

    if(headerView)
        return headerView;

    float w = [[self view] bounds].size.width;

    CGRect headerFrame = CGRectMake(0, 0, w, 64);
    CGRect labelFrame = CGRectMake(8, 8, w - 16, 48);

    UILabel *headerText = [[UILabel alloc] initWithFrame:labelFrame];
    [headerText setNumberOfLines:0];
    [headerText setFont:[UIFont boldSystemFontOfSize:14.0]];
    [headerText setBackgroundColor:[UIColor groupTableViewBackgroundColor]];

    headerView = [[UIView alloc] initWithFrame:headerFrame];
    [headerView setBackgroundColor:[UIColor groupTableViewBackgroundColor]];
    [headerView addSubview:headerText];

    return headerView;

}

@end

В другом контроллере представления я хочу повторно использовать один и тот же объект HeaderView, поэтому я объявил мой интерфейс таким образом;

@interface CitationViewController : UIViewController {
    UIView *headerView;
}

@property (nonatomic, retain) UIView *headerView;

@end

я использую [citationViewController setHeaderView:headerView]; назначить мой headerView в пределах ArticleViewController прежде чем я толкнул citationViewController на мой уиинавконтроллер.

Все работает нормально, и я получаю один и тот же заголовок, показывающий, когда новые нагрузки на вид. Проблема в том, когда я поп CitationViewController от UinaVController и вернитесь на старый взгляд, я потерял headerView объект внутри ArticleViewController.

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

Я использую вид в заголовке для UiableView, и я подумал, что это может быть эта проблема; UiableView раздел заголовок и раздел нижнего колонтитула не обновляют (проблема RedRaw) Но перезагрузка данных не исправила.

Я понял, что я не увеличил счет удержания для headerView Итак, когда я передаю это к CitationViewController И это уменьшение удержания подсчета я рассмотрев объект. Итак, я добавил [headerView retain] Звоните перед вызовом сеттера, но это, похоже, не сохраняет заголовок, пока я перезагружаю старый вид.

Нужно ли иметь какой-то укладки в моем доступе. Примеры пользовательских Getter всегда имеют примативные типы или простые объекты, это проблема, потому что есть еще один объект UIView headerView Как подзрено?

Я также считал изменение @property (retain) иметь assign или copy но застрял, как я не реализую copyWithZone Протокол и не был уверен, как.

Я читал все эти разные аспекты и понимаю их в изоляции, но, похоже, не сможет объединить их как целое целое. Что я неправильно понял во всем этом?

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top