Подтвердить что ты не робот

UIViewController не сохраняет свой программно созданный UISearchDisplayController

В UIViewController documentation о свойстве searchDisplayController 1 говорится:

Если вы программным образом создаете свой контроллер отображения поиска, это свойство автоматически устанавливается контроллером дисплея поиска, когда оно инициализируется.

И когда я создаю свой UISearchDisplayController таким образом:

[[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self] autorelease];

-[UIViewController searchDisplayController] не nil. Однако он завершается после завершения цикла событий, что приводит к тому, что контроллер отображения не отображается, когда я касаюсь панели поиска. Ничего не происходит. Это очень странно. Если я опускаю вызов autorelease, все работает:

[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];

Однако утечка UISearchDisplayController (я проверил это с помощью инструментов). Поскольку свойство searchDisplayController помечено как (nonatomic, retain, readonly) Я ожидаю, что он сохранит UISearchDisplayController после его установки.

Связана эта статья stackoverflow.

4b9b3361

Ответ 1

Я столкнулся с тем же. Я создаю все мои контроллеры/представления программно. Все работало нормально, пока я не превратил свой проект в использование ARC. Как только я сделал UISearchDisplayControllers, больше не сохранялся, а свойство searchDisplayController в каждом UIViewController было равно нулю после окончания цикла выполнения.

У меня нет ответа, почему это происходит. Документы Apple предлагают, чтобы SDC был сохранен контроллером представления, но этого явно не происходит.

Мое решение состояло в том, чтобы создать второе свойство, чтобы сохранить SDC, и я потеряю его, когда я выгружаю представление. Если вы не используете ARC, вам нужно освободить mySearchDisplayController в viewDidUnload и dealloc. В противном случае это хорошо, как есть.

В MyViewController.h:

@property (nonatomic, strong) UISearchDisplayController * mySearchDisplayController;

В MyViewController.m:

@synthesize mySearchDisplayController = _mySearchDisplayController;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // create searchBar
    _mySearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
    _mySearchDisplayController.delegate = self;
    _mySearchDisplayController.searchResultsDataSource = self;
    _mySearchDisplayController.searchResultsDelegate = self;
    // other stuff
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    _mySearchDisplayController = nil;
    // other stuff
}

Ответ 2

Решение выше работает отлично, но я также обнаружил, что вы можете использовать

[self setValue:mySearchDisplayController forKey:@"searchDisplayController"]

в контексте подкласса UIViewController.