Aucune action sur UIButtonBarItem

Ben77650Ben77650 Membre
août 2014 modifié dans API UIKit #1

Bonjour à  tous,


 


J'ai un problème plutôt que je vais vous décrire.


 


J'utilise une barre de menu (UIToolbar) possédant des UIButtonBarItem sur chaque vue de mon application.


 


Cette barre de menu ainsi que ces boutons marchent bien sur toutes les pages exceptés une.


 


J'ai essayé en glissant le bouton dans mon code via le IBAction, rien ne se passe. J'ai essayé de définir manuellement mon action (via le code ci-dessous) et rien ne passe non plus. J'ai même essayé de définir un delegate sur mon UIToolbar en me disant que ça venait peut être de la, mais toujours rien.



[_silhouette setAction:@selector(connexionMembre)];

_silhouette est évidemment mon UIBarButtonItem.


 


J'aimerais vraiment qu'on m'explique pourquoi cela ne marche pas sur cette vue alors qu'elle marche sur toutes les autres.


«1

Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu essaies de de mettre le méthode dans quelle classe ?


  • Dans ma classe de messages citée plus bas ;)


     


    J'ai bien le même nom pour l'interface et pour la classe, c'est pas un souci




  • J'ai essayé en glissant le bouton dans mon code via le IBAction, rien ne se passe. J'ai essayé de définir manuellement mon action (via le code ci-dessous) et rien ne passe non plus. J'ai même essayé de définir un delegate sur mon UIToolbar en me disant que ça venait peut être de la, mais toujours rien.



    [_silhouette setAction:@selector(connexionMembre)];

    _silhouette est évidemment mon UIBarButtonItem.


     




     


    Tu as effectivement plusieurs solutions pour attribuer une IBAction à  une méthode. Par le xib en faisant glisser la souris comme tu as du essayer, et par le code. 


    Dans le cas du code, je crois qu'il ne faut pas le faire trop tôt, car sinon la vue n'est pas complètement chargée au moment où tu fais ton "setAction".


     


    Pour ma part, j'utilise plutôt ceci :



    UIBarButtonItem *myButton=[[UIBarButtonItem alloc] initWithTitle:@myTitle style:UIBarButtonItemStyleDone target:self action:@selector(myAction)];
    self.navigationItem.rightBarButtonItem=myButton;



    que je mets dans le viewDidLoad...

  • Ben77650Ben77650 Membre
    août 2014 modifié #5

    Effectivement j'ai essayé via le xib en faisant glisser ;)


     


    Le setAction a été fait dans le viewDidLoad, ta solution j'en suis pas forcément fan, puisque mon button existe déjà  donc à  quoi bon le recréer ;)


  • Oui, j'ai bien compris qu'il existait déjà  ! Mais, soit tu le crée uniquement par code, avec ce que je t'ai écrit, soit tu le fait par xib avec le glisser du bouton vers le code (pas de raison que çà  ne marche pas) ; soit encore si tu veut attribuer l'action par code sur un bouton existant, il faut faire le setAction quand la vue est finie de charger (viewDidAppear plutôt).


    Sinon ta méthode existe bien ? 


    Elle n'a pas d'argument ? (si c'est le cas, ne pas oublier les ":" après son nom dans le selector) : @selector(myAction:).


     


    As tu essayé de faire un clean de ton projet, car il peut y avoir une ancienne méthode qui est linkée au bouton et qui n'existe plus...


  • Joanna CarterJoanna Carter Membre, Modérateur

    Est-ce que tu peux nous montrer le code de ta classe et une capture d'écran de ton xib ?


  • @Alf, j'ai mis mon code dans le viewDidAppear, la méthode existe bien, elle n'a pas d'arguments, j'ai fait un clean de mon projet et pourtant toujours rien


     


    @Joanna oui je te met ça en dessous, il faut savoir que dans mon menu (en bas) l'étoile s'affiche en jaune orangée, et la silhouette en blanc ;)


     


    MessTchat.m



    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    self.title=@Tchat privé;
    }
    return self;
    }

    - (void)viewDidLoad
    {
    [super viewDidLoad];

    KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@MyAppName accessGroup:nil];
    NSString *adEmail = [keychainItem objectForKey:(__bridge id)(kSecValueData)];

    MyManager *sharedManager = MyManager.sharedManager;
    if(sharedManager.userName !=nil || ![adEmail isEqualToString:@""])
    {
    _silhouette.tintColor=UIColor.whiteColor;
    }
    else
    {
    _silhouette.tintColor=[UIColor colorWithRed:51.0/255.0 green:153.0/255.0 blue:153.0/255.0 alpha:1];
    }

    SerializableRepository* ser = [[SerializableRepository alloc]init];

    if(0<ser.recupAll.count)
    {
    _etoile.tintColor=[UIColor colorWithRed:255.0/255.0 green:165.0/255.0 blue:0.0/255.0 alpha:1];
    }
    else
    {
    _etoile.tintColor=[UIColor colorWithRed:51.0/255.0 green:153.0/255.0 blue:153.0/255.0 alpha:1];
    }



    self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:self action:@selector(back)];

    _vert1.layer.cornerRadius=10;
    _bleu1.layer.cornerRadius=10;
    _envoyer.layer.cornerRadius=10;

    _bleu1.hidden=YES;
    _vert1.hidden=YES;
    _subtextB1.hidden=YES;
    _subtextV1.hidden=YES;

    _messageField.returnKeyType = UIReturnKeyDone;
    _messageField.delegate=self;

    _scroll.delegate=self;
    _scroll.scrollEnabled=YES;

    CGRect screenBounds = UIScreen.mainScreen.bounds;

    if(screenBounds.size.height == 480)
    {
    CGRect messageFrame = _messageField.frame;
    messageFrame.origin.y = 280;
    _messageField.frame= messageFrame;

    CGRect envoyerFrame = _envoyer.frame;
    envoyerFrame.origin.y = 280;
    _envoyer.frame= envoyerFrame;

    }

    }

    -(void)viewDidAppear:(BOOL)animated{

    [_silhouette setAction:@selector(connexionMembre)];

    [_etoile setAction:@selector(accesFavori)];

    }

    -(BOOL)textFieldShouldReturn:(UITextField *)thetextField
    {
    [_messageField resignFirstResponder];
    return YES;
    }

    - (void)textFieldDidBeginEditing:(UITextField *)textField {
    CGPoint scrollPoint = CGPointMake(0, textField.frame.origin.y);
    [_scroll setContentOffset:scrollPoint animated:YES];
    }

    - (void)textFieldDidEndEditing:(UITextField *)textField {
    [_scroll setContentOffset:CGPointZero animated:YES];
    }

    - (void)didReceiveMemoryWarning
    {
    [super didReceiveMemoryWarning];
    }

    -(void) back{
    ListTchat* tchat = [[ListTchat alloc]init];
    [self.navigationController pushViewController:tchat animated:NO];
    }

    - (IBAction)sendMessage:(id)sender {

    _bleu1.text=_messageField.text;
    NSString* messageBlue1 = _messageField.text;
    CGSize maxLabelSize = CGSizeMake(200, 10000);

    CGSize expectedLabelSize = [messageBlue1 sizeWithFont:_bleu1.font constrainedToSize:maxLabelSize lineBreakMode:NSLineBreakByWordWrapping];

    CGRect newFrame = _bleu1.frame;
    newFrame.size.height = expectedLabelSize.height+10;

    _bleu1.frame=newFrame;

    CGRect textFrame = _subtextB1.frame;
    textFrame.origin.y = expectedLabelSize.height+25;
    _subtextB1.frame=textFrame;


    //TEST
    _vert1.text=@Bonjour Monsieur, quels renseignements souhaitez-vous obtenir concernant le véhicule que je vends ?;
    NSString* messageGreen1 = @Bonjour Monsieur, quels renseignements souhaitez-vous obtenir concernant le véhicule que je vends ?;

    CGSize maximumLabelSize = CGSizeMake(200, 10000);

    CGSize expectLabelSize = [messageGreen1 sizeWithFont:_vert1.font constrainedToSize:maximumLabelSize lineBreakMode:NSLineBreakByWordWrapping];

    CGRect nouvFrame = _vert1.frame;
    nouvFrame.origin.y = expectedLabelSize.height+50;
    nouvFrame.size.height = expectLabelSize.height+10;

    _vert1.frame = nouvFrame;

    CGRect texteFrame = _subtextV1.frame;
    texteFrame.origin.y = nouvFrame.origin.y + expectLabelSize.height + 8;
    _subtextV1.frame=texteFrame;

    _bleu1.hidden=NO;
    _vert1.hidden=NO;
    _subtextB1.hidden=NO;
    _subtextV1.hidden=NO;

    [_messageField resignFirstResponder];
    _messageField.text=@"";
    }

    -(void)connexionMembre
    {
    Connexion* profil = [[Connexion alloc]init];
    [self.navigationController pushViewController:profil animated:NO];
    }

    -(void)accesFavori
    {
    FavorisViewController* fav = [[FavorisViewController alloc]init];
    [self.navigationController pushViewController:fav animated:NO];
    }

    - (IBAction)offres:(id)sender {
    OffreViewController* offre = [[OffreViewController alloc]init];
    [self.navigationController pushViewController:offre animated:NO];
    }

    - (IBAction)ajout:(id)sender {
    AjouterOffre* add = [[AjouterOffre alloc]init];
    [self.navigationController pushViewController:add animated:NO];
    }

    - (IBAction)listeFav:(id)sender {
    FavorisViewController* fav = [[FavorisViewController alloc]init];
    [self.navigationController pushViewController:fav animated:NO];
    }

    - (IBAction)profil:(id)sender {
    Connexion* profil = [[Connexion alloc]init];
    [self.navigationController pushViewController:profil animated:NO];
    }

    - (IBAction)home:(id)sender {
    HomeViewController* home = [[HomeViewController alloc]init];
    [self.navigationController pushViewController:home animated:NO];
    }

    @end


    MessTchat.h



    @interface MessTchat : UIViewController<UIScrollViewDelegate, UITextFieldDelegate>
    @property (weak, nonatomic) IBOutlet UIScrollView *scroll;
    @property (weak, nonatomic) IBOutlet UILabel *bleu1;
    @property (weak, nonatomic) IBOutlet UILabel *vert1;
    @property (weak, nonatomic) IBOutlet UILabel *subtextB1;
    @property (weak, nonatomic) IBOutlet UILabel *subtextV1;
    @property (weak, nonatomic) IBOutlet UITextField *messageField;
    @property (weak, nonatomic) IBOutlet UIButton *envoyer;
    @property (weak, nonatomic) IBOutlet UIBarButtonItem *etoile;
    @property (weak, nonatomic) IBOutlet UIBarButtonItem *silhouette;

    - (IBAction)sendMessage:(id)sender;
    - (IBAction)offres:(id)sender;
    - (IBAction)ajout:(id)sender;
    - (IBAction)listeFav:(id)sender;
    - (IBAction)profil:(id)sender;
    - (IBAction)home:(id)sender;

    @end

    MessTchat.xib


     


    cf miniature jointe


     


    Voila :)


  • Joanna CarterJoanna Carter Membre, Modérateur
    août 2014 modifié #9

    Tu n'as pas marqué la méthode -connexionMembre come IBAction, ni dans le .h, ni dans le .m ; du coup, le drag ne marchera pas dans le xib


  • Parce que c'est pas une IBAction, c'est justement quand j'ai essayé de le linker via le code, d'ou le void. L'IBAction qui fais la même chose est "profil" ;)


  • Joanna CarterJoanna Carter Membre, Modérateur

    Mais pourquoi avoir les deux méthodes qui font la même chose ? 


  • La première méthode via IBAction ne marchant pas, j'ai essayé la méthode par code via le void pour voir si celle la marchait, mais force est de constater que non


  • Joanna CarterJoanna Carter Membre, Modérateur

    Question - tu as utiliser un UIToolbar et un UINavigationController pour faire la même chose que l'on obtienne en utilisant un UITabViewController. En fait, tu as réinventé la roue mais avec plus de code.  ::)

  • Que veut tu dire ? Je ne comprends pas trop ce dont tu me parles.


     


    Tu penses que le souci puisse venir de ça ?


  • Joanna CarterJoanna Carter Membre, Modérateur

    Tous dans un storyboard ci-joint


  • Euh oui et ? J'ai bien vu que l'item 2 apparait 4 fois différents, mais je vois pas où tu veut en venir...


  • Joanna CarterJoanna Carter Membre, Modérateur

    Le text sur les vues est le résultat de copier/coller mais le principe est qu'il n'est pas nécessaire d'écrire du code pour changer la vue sélectionné, ni de connecter les boutons


  • Ben77650Ben77650 Membre
    août 2014 modifié #18

    Oula, tu m'intrigues fortement en me disant ça.


     


    Je ne sais pas si ça joue, mais je n'utilise pas le storyboard.


     


    Tu penses vraiment que mon souci viendrait de la ?


  • Joanna CarterJoanna Carter Membre, Modérateur

    Non mais, en utilisant un storyboard, tu t'économises du code et de soucis


  • Je suis peut être un vieux c** adepte du "c'était mieux avant" mais je trouve ça plus simple et plus intuitif sans utiliser le storyboard, surtout que j'ai appris sans les storyboards :P


     


     


    Une idée de la source de mon problème s'il te plait ?


  • Joanna CarterJoanna Carter Membre, Modérateur

    Aucune idée. J'ai reconstruit un xib avec ViewController et Toolbar et j'ai pu connecter les boutons aux méthodes, comme tu peux voir ci-joint


  • Bah la mes boutons sont connectés, mais il ne se passe rien


     


    La preuve en miniature :)


     


     


     


     


  • Joanna CarterJoanna Carter Membre, Modérateur

    Deux questions :


     


    1. Comment crées-tu le ViewController et le View ?


     


    2. Les méthodes, sont-ils appelés ?


  • Bah "New File" => "Objective C class" puis "UIViewController" et je coche "Also create XIB File"


     


    Oui les méthodes sont appelés automatiquement via le IBAction


  • MarcoDahMarcoDah Membre
    août 2014 modifié #25

    Une idée bête, as tu activé le champs " User Interaction Enable" de ton bouton ou de ta toolbar ?


  • Tellement bête que je ne l'ai pas précisé lors de mon 1er message, c'est effectivement coché sur Enabled et donc activé ;)


  • Joanna CarterJoanna Carter Membre, Modérateur


    Bah "New File" => "Objective C class" puis "UIViewController" et je coche "Also create XIB File"




     


    No, je voulais dire comment crées-tu le ViewController dans ton code ?


     




     


     


    Oui les méthodes sont appelés automatiquement via le IBAction




     


    Alors, selon ta capture d'écran, le boutons sont biens connectés aux méthodes ; qu'est-ce qui ne fonctionne pas ?

  • Bah je crée mon ViewController comme cela, si c'est ça la question ^^



    MessTchat* mess = [[MessTchat alloc]init];
    [self.navigationController pushViewController:mess animated:NO];

    Le problème est la justement, ce que j'ai fait pour cette vue, je l'ai fait pour toutes les autres et ça ne fonctionne pas dans cette vue et je ne comprends pas. Si j'appuie sur les boutons de mon menu, absolument rien ne se passe, chose absolument pas normale...


  • Joanna CarterJoanna Carter Membre, Modérateur


    Bah je crée mon ViewController comme cela, si c'est ça la question ^^



    MessTchat* mess = [[MessTchat alloc]init];
    [self.navigationController pushViewController:mess animated:NO];



     


    Mais [[MesTChat alloc] init] ne créera que le ViewController sans le View du xib, sauf si tu "override" la méthode init ; ce que tu n'as pas fait selon le code que tu as posté

  • Bah pourtant je fais ça absolument partout, à  chaque fois que je doit changer de vue, et ça marche partout hormis dans MessTchat ;)


  • Et sinon si je l'override la méthode, avec le super initWithNibName... qui est créée automatiquement :)



    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    self.title=@Tchat privé;
    }
    return self;
    }
Connectez-vous ou Inscrivez-vous pour répondre.