UIViewController не сохраняет свой программно созданный UISearchDisplayController - PullRequest
30 голосов
/ 06 октября 2011

В документации UIViewController о свойстве 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 после его установки.

Эта статья о переполнении стека связана.

Ответы [ 2 ]

53 голосов
/ 31 октября 2011

Я столкнулся с тем же.Я создаю все мои контроллеры / представления программно.Все работало нормально, пока я не перевел свой проект на использование 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
}
3 голосов
/ 29 марта 2012

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

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

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

...