2010-08-17 7 views
0

dans mon application iphone, im essayant de faire de mon uinavigationbar agir comme un bouton, je veux dire faire quelque chose quand je le touche. Pas de bouton de retour d'un élément de nav, la barre elle-même. Heres comment je "catégorisé" it:UINavigationBar avec la catégorie, agir comme bouton aussi

@implementation UINavigationBar (UINavigationBarCategory) 
- (void)drawRect:(CGRect)rect { 
    UIColor *color = [UIColor blackColor]; 
    UIImage *img = [UIImage imageNamed: @"bar.png"]; 
    [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
    self.tintColor = color; 
} 

L'action serait naviguer à une vue ..
Toutes les idées?
Merci d'avance!

+0

J'ai utilisé une catégorie parce que je pensais que c'était la seule façon de réaliser cette personnalisation de UINavigationBar. – Nicolas

Répondre

1

Ne pas utiliser des catégories pour remplacer les méthodes d'une classe. Du guide Objective-C Programming Language:

Bien que la langue permet actuellement vous d'utiliser une catégorie pour remplacer méthodes de la classe hérite, ou même méthodes déclarées dans l'interface classe , vous êtes fortement découragée d'utiliser cette fonctionnalité. Une catégorie n'est pas un remplaçant une sous-classe. Il y a plusieurs lacunes importantes :

  • Lorsqu'une catégorie remplace une méthode héritée , la méthode dans la catégorie peut, comme d'habitude, invoquez la mise en œuvre héritée par un message au super. Toutefois, si une catégorie remplace une méthode qui existait déjà dans la classe de la catégorie , il est impossible d'invoquer l'implémentation d'origine à . Une catégorie ne peut pas remplacer de manière fiable les méthodes déclarées dans une autre catégorie de la même classe. Ce numéro est de importance particulière depuis beaucoup de les classes de cacao sont mis en œuvre en utilisant des catégories. Méthode cadre défini vous essayez de passer outre peut se ont été mis en œuvre dans une catégorie, et ainsi qui prend la mise en œuvre priorité est pas définie.

  • La présence de certaines méthodes peuvent provoquer des changements de comportement dans tous les cadres. Par exemple, si vous ajoutez une mise en œuvre de windowWillClose: à NSObject, cela entraînera toutes les fenêtres délégués pour répondre à cette méthode et peut modifier le comportement de toutes les instances instances de NSWindow. Cette peut provoquer des changements mystérieux comportement et peut conduire à des accidents.

Au lieu de cela, vous pourriez être mieux servis en créant simplement une vue transparente ou bouton qui répond au toucher et de placer ce au-dessus du bar pour votre UINavigationController. Cette vue transparente pourrait alors capturer les événements tactiles destinés à l'ensemble de la zone du bar.

Cependant, je pense vraiment dur à ce que vous essayez d'atteindre avec cela.Surcharger les interactions utilisateur standard à partir d'un élément d'interface intégré peut entraîner une frustration de l'utilisateur et même un rejet potentiel de la part d'Apple.

+0

En principe vous avez raison, mais dans cet appareil particulier, je dirais qu'une catégorie est bien. Nicolas ne semble pas trop expérimenté avec Cocoa Touch, à en juger par le drawRect: -method il y a peu d'autres fonctionnalités à gâcher, et sous-classer UINavigationBar est _quite_ tricky, selon mon expérience. – eliego

+0

Ok génial! Je verrai ce que je peux faire avec les deux réponses. PS. Im pas expérimenté avec Cocoa Touch .. Je fais de mon mieux cependant. – Nicolas

+0

@eliego - Dans ce cas, le sous-classement n'est pas nécessaire. Il peut simplement mettre une vue transparente ou un bouton sur la partie de la barre de navigation de l'écran et avoir cette poignée les touches. Promouvoir une pratique que Apple met en garde explicitement n'est pas la bonne façon de lancer un nouveau développeur sur la plateforme. Vous voulez que les gens acquièrent de bonnes habitudes lorsqu'ils apprennent d'abord l'environnement. –

0
+0

Merci de faire un essai et de revenir! – Nicolas

+0

Ok, donc im supposé utiliser ces 3 fonctions: - (void) touchesBegan: (NSSet *) touche avecEvent: (UIEvent *) événement - (void) touchesMoved: (NSSet *) touche avecEvent: (UIEvent *) event - (void) touchesEnded: (NSSet *) touche àEvent: (UIEvent *) événement im assez nouveau à comment fonctionne primordiale, alors s'il vous plaît soyez gentil .. Dois-je écrire mon code à l'intérieur, ou dois-je faire quelque chose avec les params aussi? Merci pour la réponse rapide! edit: ok j'abandonne, je ne sais pas comment ajouter un tag de code dans un commentaire ici .. – Nicolas

+0

Commencez par les implémenter dans votre catégorie (exactement comme vous l'avez fait avec drawRect :), et affichez NSLog pour comprendre comment ils sont appelés. En fin de compte, vous n'aurez probablement qu'à ajouter du code à la touche TouchEnded: -method, et y exécuter n'importe quelle action. – eliego

Questions connexes