Как я могу сохранить свой пользовательский UIView от моей ленивой загрузки Получить аксессуар и назначить его другим представлениям?
-
26-09-2019 - |
Вопрос
Я хочу повторно использовать тот же объект 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 может появиться только в одном представлении одновременно. Когда вы добавляете вид на другой вид, он будет автоматически удален с любого другого представления.
Вам также необходимо иметь один экземпляр для каждого представления для каждого представления, либо добавить дополнительный код, чтобы убедиться, что один объект перемещается между просмотрами. Первый был бы общим подходом (большинство представленных объектов не забирают достаточно памяти, чтобы беспокоиться о том, пока последний будет очень необычным.