Я хочу повторно использовать один и тот же объект UIView в качестве заголовка таблицы в разных UIViewControllers.
У меня есть класс ArticleViewController;
@interface ArticleViewController : UIViewController {
UIView *headerView;
}
- (UIView *)headerView;
@end
Затем я реализую метод доступа headerView
get для отложенной загрузки объекта;
#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
на свой UINavController.
Все работает нормально, и я получаю тот же заголовок, который отображается при загрузке нового представления. Проблема в том, что когда я вытаскиваю CitationViewController
из UINavController и возвращаюсь к старому представлению, я потерял объект headerView
в ArticleViewController
.
Я пытался просто передать указатель на указатель, но у меня возникли проблемы с компиляцией **UIView
и &headerView
. Я думал, что у меня может быть только один объект в памяти, и оба представления имеют свои собственные указатели на него. Я не ушел далеко и пошел искать другой путь.
Я использую представление в заголовке для UITableView, и я подумал, что это может быть этой проблемой; Заголовок раздела UITableView и нижний колонтитул раздела не обновляются (проблема с перерисовкой) , но при повторной загрузке данных это не помогло.
Затем я понял, что не увеличил счетчик хранения для headerView
, поэтому, когда я передам его в CitationViewController
, и это уменьшает счетчик хранения, я освобождаю объект. Затем я добавил вызов [headerView retain]
перед вызовом установщика, но, похоже, заголовок не отображается при перезагрузке старого представления.
Нужно ли иметь какой-то шаблон сохранения в моём аксессоре get? Пользовательские примеры геттеров всегда имеют примитивные типы или простые объекты. Проблема в том, что внутри подпрограммы headerView
есть еще один объект UIView?
Я также рассмотрел вопрос об изменении @property (retain)
на assign
или copy
, но застрял, так как не реализую протокол copyWithZone
и не знал, как это сделать.
Я читал по всем этим различным аспектам и понимаю их изолированно, но, похоже, не смог объединить их в единое целое. Что я не так понял во всем этом?