2017-10-12 4 views
0

j'ai un accident uniquement sur IOS 11: [__NSCFNumber isEqualToString]: sélecteur non reconnu envoyé à l'instanceNSCFNumber isEqualToString: IOS11 collision entre viewDidLoad et viewWillApear

étape de débogage par l'étape indique que le blocage se produit après la fin de viewDidLoad et avant d'entrer viewWillApear

Comment puis-je déboguer?

J'ai essayé avec un breakpoint d'exception mais je n'ai plus d'informations. l'accident est clair, mais je n'ai pas de code et avant d'après le moment de l'accident, je ne l'utilise « isEqualToString » ou « objectAtIndex » ...

Code viewDidLoad:

self.buttonCancel = [[UIBarButtonItem alloc] initWithTitle:@"ANNULER" style:UIBarButtonItemStylePlain target:self action:@selector(actionCancel)]; 
[self.buttonCancel setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [EATColor colorBlack], NSForegroundColorAttributeName,[EATFont ElleNovaCExtraBold:12],NSFontAttributeName,NSKernAttributeName, @(0.66), nil] forState:UIControlStateNormal]; 

[super viewDidLoad]; 

// Do any additional setup after loading the view. 

[self buildCollectionViewListing]; 

self.collectionView.delegate = self; 
self.collectionView.dataSource = self; 
self.collectionView.backgroundColor = [UIColor clearColor]; 

[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTitle:@"ANNULER"]; 


[self.collectionView registerNib:[UINib nibWithNibName:@"EATSearchRecetteCollectionViewCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"idSearchRecette"]; 
[self.collectionView registerNib:[UINib nibWithNibName:@"EATSearchArticleCollectionViewCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"idSearchNews"]; 
[self.collectionView registerNib:[UINib nibWithNibName:@"EATSearchGalleryCollectionViewCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"idSearchGallery"]; 
[self.collectionView registerNib:[UINib nibWithNibName:@"EATSearchVideoCollectionViewCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"idSearchVideo"]; 
[self.collectionView registerNib:[UINib nibWithNibName:@"EATSearchHeaderCollectionViewCell" bundle:[NSBundle mainBundle]] forSupplementaryViewOfKind: UICollectionElementKindSectionHeader withReuseIdentifier:EATSearchHeaderCollectionViewIdentifier]; 

if (self.searchedText) { 

    if (self.searchBar) { 
     self.searchBar.text = self.searchedText; 
    }else { 
     self.title = [self.searchedText uppercaseString]; 
    } 

    [self loadData]; 
} 
+0

Quel est le journal de plantage complet? Cela n'arrive pas sur iOS10? – Larme

+0

Est-ce que votre ViewController a une super classe? Avez-vous vérifié super viewdidload? quel objet ajoutez-vous dans votre viewController? –

+0

Lorsqu'il tombe en panne, tapez "bt" dans la console de débogage à l'invite "(lldb)". Ajoutez cette trace de pile à votre question. –

Répondre

1

Telle est la ligne coupable:

[self.buttonCancel setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [EATColor colorBlack], NSForegroundColorAttributeName,[EATFont ElleNovaCExtraBold:12],NSFontAttributeName,NSKernAttributeName, @(0.66), nil] forState:UIControlStateNormal]; 

Qu'est-ce qui se passe?

[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 

Cela signifie que, à un moment il y a un objet NSNumber appeler une méthode isEqualToString:. Il ne le sait pas (c'est une méthode NSString), puis il plante. Ce qui n'est pas dit, c'est que vous n'avez pas besoin de vous appeler isEqualToString:, ce pourrait être un appel caché dans le code SDK d'Apple, et c'est ce qui se passe.

Attributs Dictionnaire NSAttributedString doit avoir NSString clés et les valeurs doivent être de la classe correspondante dans la doc de la clé (il est parfois un NSNumber, parfois un UIFont, un UIColor), etc.

Dans votre cas , vous avez inversé la clé et l'objet pour le dernier, dictionaryWithObjectsAndKeys: attend l'objet, puis la touche. Mais dans la dernière valeur de remplissage, vous les avez inversés (NSKernAttributeName, @(0.66)). C'est toujours un dictionnaire valide, mais ne respecte pas les règles d'attributs.

Ainsi, à quelques points du code Apple va vérifier chaque touche, les comparer (appeler isEqualToString: savoir quels effets doit être appliquée. Mais il comparera @ (0,66) avec NSSomeAttributeName ([@(0.66)isEqualToString:NSSomeAttributeName]) sans vérifier la classe de @(0.66) premier.

Le correctif:

[self.buttonCancel setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [EATColor colorBlack], NSForegroundColorAttributeName,[EATFont ElleNovaCExtraBold:12],NSFontAttributeName,@(0.66), NSKernAttributeName, nil] forState:UIControlStateNormal]; 

Il est plus simple d'écrire (et plus facile à voir dans un coup d'oeil ce qui est essentiel et ce qui est la valeur):

[self.buttonCancel setTitleTextAttributes:@{NSForegroundColorAttributeName: [EATColor colorBlack], 
              NSFontAttributeName: [EATFont ElleNovaCExtraBold:12], 
              NSKernAttributeName: @(0.66)} 
           forState:UIControlStateNormal]; 
+0

Et cela fonctionne bien, merci –