Как мне сохранить свой пользовательский UIView из моего ленивого загрузчика get и присвоить его другим представлениям? - PullRequest
0 голосов
/ 19 ноября 2010

Я хочу повторно использовать один и тот же объект 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 и не знал, как это сделать.

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

1 Ответ

0 голосов
/ 19 ноября 2010

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

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

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