30 votes

UIViewController ne conserve pas son UISearchDisplayController créé par programme

Dans l' UIViewController de la documentation sur l' searchDisplayController de la propriété 1 , il est dit:

Si vous créez votre recherche de contrôle de l'affichage de la programmation, cette propriété est définie automatiquement par la recherche de contrôle de l'affichage lorsqu'il est initialisé.

Et quand j'ai créer mon UISearchDisplayController ainsi:

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

-[UIViewController searchDisplayController] n'est nil. Cependant, il est annulé après l'événement boucle se termine, ce qui provoque la recherche de contrôle de l'affichage de ne pas le montrer quand je touche à l'intérieur de la barre de recherche. Rien ne se bloque. C'est très bizarre. Si je omettre l'appel à autorelease, tout fonctionne:

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

Cependant, les fuites de l' UISearchDisplayController (j'ai vérifié cela avec des Instruments). Depuis l' searchDisplayController propriété est marqué comme (nonatomic, retain, readonly) - je attendre qu'elle conserverait l' UISearchDisplayController après elle est définie.

Cette stackoverflow article est lié.

53voto

XJones Points 14327

J'ai couru dans la même chose. Je crée tous mes contrôleurs/points de vue de la programmation. Tout fonctionnait bien jusqu'à ce que j'ai converti mon projet pour l'utilisation de l'ARC. Une fois que je ne l' UISearchDisplayControllers étaient plus retenus et l' searchDisplayController propriété dans chaque UIViewController a été de néant après l'exécution de la boucle est terminée.

Je n'ai pas de réponse pourquoi ce qui se passe. La Pomme docs suggèrent que la DDC doit être conservé par le point de vue du contrôleur, mais ce n'est clairement pas passe.

Ma solution a été de créer une deuxième propriété de retenir la DDC et j'ai néant quand je décharger la vue. Si vous n'êtes pas à l'aide de l'ARC, vous devez libérer mySearchDisplayController en viewDidUnload et dealloc. Sinon, c'est bien comme c'est.

Dans MyViewController.h:

@property (nonatomic, strong) UISearchDisplayController * mySearchDisplayController;

Dans 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
}

3voto

Andrew Carter Points 754

La solution ci-dessus fonctionne très bien, mais j'ai également constaté que vous pouvez utiliser

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

dans le cadre d'une sous-classe UIViewController .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X