TabBar et Navigation Based

frenchefrenche Membre
06:13 modifié dans Vos applications #1
Bonjour à  tous.

Je suis en train de me casser la tête sur un problème à  la c..

Voici j'ai finis de développer un grande partie de l'application, et j'ai voulu la rendre plus agréable.

Je suis partis d'une application TabBar (7 items) à  une application TabBar et Navigation.
Mon souci est le suivant.

Une fois rentré dans la seconde view du navigation based çà  plante.
Première vue: choix de sous menu.
Second view: feuille de calcul.

Si je laisse la seconde view vierge tout est bon.
En revanche si j'insère la classe IUVIEW de codes de calcul tout bug.

Voici des extraits du codage.

PremiereViewController.h

[tt]
-(IBAction)ctaete:(id)sender;I[/tt]

PremiereViewController.m
[tt]-(IBAction)ctaete:(id)sender;
{
    CtaEteViewController *ctaete = [[CtaViewController alloc] initWithNibName:@CtaEteViewController bundle:nil];
        [self.navigationController pushViewController:ctaete animated:YES];
        [ctaete release];
}
[/tt]

Quand je lance l'application voici l'erreur.

[tt]2011-09-29 11:02:55.763 CFC[11992:10d03] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<CtaViewController 0x5ca61f0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key fieldVBF.'
*** Call stack at first throw:[/tt]

Et si je retire l'association TabBar et Navigation Based, tout fonctionnement correctement.


Une idée ?

Réponses

  • CéroceCéroce Membre, Modérateur
    06:13 modifié #2
    Tu as une vieille outlet qui s'appelle fieldVBF et qui traà®ne.

    Ouvre le xib, ouvre le panneau de droite et va dans l'onglet représentant une flèche. Tu dois avoir un lien vers fieldVBF qui n'existe plus (indiqué par un point d'exclamation).
  • frenchefrenche Membre
    06:13 modifié #3
    Bon j'ai repris tous mes liens un par un (tous refait).

    L'application bug toujours mais plus sur la même erreur.

    [tt]2011-09-29 11:32:23.793 CFC[12190:10d03] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<CtaViewController 0x5c4b0d0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key fieldTAS.'
    *** Call stack at first throw:[/tt]

    Et une erreur sur:
    [tt][self.navigationController pushViewController:ctaete animated:YES];[/tt] écrit sur la droite [tt]Thread 1: Program received signal: "SIGABRT".[/tt]



  • AliGatorAliGator Membre, Modérateur
    06:13 modifié #4
    Bah ça veut dire que tu as le même problème que ce que t'as décrit Céroce, mais cette fois sur un IBOutlet nommé "fieldTAS"... il doit encore y en avoir un qui traine que tu avais connecté à  une époque et qui depuis n'existe plus dans ton code.
  • frenchefrenche Membre
    06:13 modifié #5
    J'ai tout refait et pas de point d'exclamation.

    ça ne pourrait pas venir d'ailleurs ?
  • CéroceCéroce Membre, Modérateur
    06:13 modifié #6
    Essaie de faire un Clean.
    Il est très peu probable que ça vienne d'autre chose que d'une vieille outlet oubliée.
  • frenchefrenche Membre
    06:13 modifié #7
    En faisant un clean çà  me déplace l'erreur sur une autre donnée.

    Ai je bien tout mis dans le autres classes ?

    AppDelegate.h

    [tt]@interface CFCAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate>

    @property (nonatomic, retain) IBOutlet UIWindow *window;

    @property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;

    @end[/tt]

    AppDelegate.m

    [tt]#import "CFCAppDelegate.h"

    @implementation CFCAppDelegate

    @synthesize window = _window;
    @synthesize tabBarController = _tabBarController;

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        // Override point for customization after application launch.
        // Add the tab bar controller's current view as a subview of the window
        self.window.rootViewController = self.tabBarController;
        [self.window makeKeyAndVisible];
        return YES;
    }[/tt]

  • CéroceCéroce Membre, Modérateur
    septembre 2011 modifié #8
    Quand on tire un contrôle vers le contrôleur pour créer une outlet, il se passe deux choses:
    - la propriété IBOutlet est déclarée dans le .h et synthétisée dans le .m du contrôleur
    - le .xib enregistre que l'outlet est accrochée à  File's Owner (= le contrôleur)

    Rappelons que les outlets sont des variables d'instance vers les objets du .nib. Quand le .nib est chargé, UIKit fixe les outlets. Pour cela, il utilise le Key-Value Coding. Sans entrer dans les détails, le KVC permet d'accéder à  une variable d'instance par son nom.
    Ainsi pour fixer l'outlet champDeTexte, UIKit fait quelque chose comme ça:

    // Instanciation du champ de texte<br />UITextField *aTextField = [[UITextField alloc] initWithFrame:aFrame];&nbsp; <br /><br />// Faire pointer l&#039;outlet vers l&#039;instance du champ de texte<br />[filesOwner setValue:aTextField forKey:@&quot;champDeTexte&quot;]; <br />
    


    Ton problème est que tu as supprimé la déclaration de la propriété de l'outlet, mais que tu ne l'as pas détachée dans le .xib.
    Ainsi, lorsque setValue:forKey: est appelée, la clé (qui correspond à  la variable d'instance) n'existe pas et tu vois ce message d'erreur.

    Donc, il faut faire un tour de tous les File's Owner et retirer les outlets qui n'existent plus.
  • frenchefrenche Membre
    06:13 modifié #9
    Ce que je ne comprends pas trop c'est avant de créer la navigation based tout fonctionne bien, mais une fois le code modifié çà  bug.

    Dans mon .xib le File's Owner est bien lié. Chaque champ est connecté sur une case Text Field.

    J'ai déclaré comme suit.

    ...ViewController.h
    [tt]@interface CtaEteViewController : UIViewController {
       
        IBOutlet UITextField *fieldTAN;
        IBOutlet UITextField *fieldHAM;
    }

    @property (nonatomic, retain) IBOutlet UITextField *fieldTAN;
    @property (nonatomic, retain) IBOutlet UITextField *fieldHAM;

    - (IBAction) calculate;

    @end
    [/tt]


    ...ViewController.m
    [tt]
    @implementation CtaEteViewController

    @synthesize fieldTAN;
    @synthesize fieldHAM;

    - (IBAction) calculate {
       
    float a = [[fieldTAN text] floatValue];

    //calcul de HAM
    float m = (1.006+l*1.826)*k+l*2501;
    fieldHAM.text = [NSString stringWithFormat: @%.2f,m];

    }
    [/tt]

  • BunoBuno Membre
    06:13 modifié #10
    Hello,
    Je ne fais que rajouter mon grain de sel mais je plussoie le fait d'avoir une vieille IBOutlet.
    En effet:
    - le message d'erreur indique qu'il ne trouve pas la clé fieldTAS
    - dans ton code, tu mentionnes fieldTAN et fieldHAM...mais pas fieldTAS


    Regarde le xib correspondant à  ton  ViewController CtaEteViewController, surtout au niveau des connexions (2e onglet je crois)
  • frenchefrenche Membre
    06:13 modifié #11
    J'ai mis qu'une partie du code.

    Tout fonctionne très calcul et affichage (mais les fonction IF et ELSE) avec un simple affichage en TabBar.
    Mais quand je rajoute une View de sysnthèse (3 choix possibles) pour mener à  mes anciennes View que tout bug.

    Je peux vous coller tout le code si vous souhaitez.
  • frenchefrenche Membre
    octobre 2011 modifié #12
    Bon j'ai beau tout essayer, je n'y arrive pas.

    J'ai simplifier mon code pour juste pour faire une addition et obtenir le résultat.
    J'ai un bug dès que je charge ma View, et je pense que celà  proviens du fait que j'ai une TextField (case) de vide (le résultat de l'addition.

    Je ne sais pas si quelqu'un peut m'aider.
    Voici une copie des codes.

    Ma View principal.h
    #import &lt;UIKit/UIKit.h&gt;<br /><br />@interface CtaViewController : UIViewController<br /><br />-(IBAction)ctaete:(id)sender;<br /><br /><br />@end
    


    View principal.m
    #import &quot;CtaViewController.h&quot;<br />#import &quot;CtaEteViewController.h&quot;<br />#import &quot;CtaHiverPulveViewController.h&quot;<br /><br /><br />@implementation CtaViewController<br /><br />-(IBAction)ctaete:(id)sender;<br /> {<br /> CtaEteViewController *ctaete = [[CtaViewController alloc]<br /> initWithNibName:@&quot;CtaEteViewController&quot; bundle:nil];<br /> [self.navigationController pushViewController:ctaete animated:YES];<br /> [ctaete release];<br /> }<br /><br />- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil<br />{<br />&nbsp; &nbsp; self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];<br />&nbsp; &nbsp; if (self) {<br />&nbsp; &nbsp; &nbsp; &nbsp; // Custom initialization<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return self;<br />}<br /><br />- (void)didReceiveMemoryWarning<br />{<br />&nbsp; &nbsp; // Releases the view if it doesn&#039;t have a superview.<br />&nbsp; &nbsp; [super didReceiveMemoryWarning];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Release any cached data, images, etc that aren&#039;t in use.<br />}<br /><br />#pragma mark - View lifecycle<br /><br />- (void)viewDidLoad<br />{<br />&nbsp; &nbsp; [super viewDidLoad];<br />&nbsp; &nbsp; // Do any additional setup after loading the view from its nib.<br />}<br /><br />- (void)viewDidUnload<br />{<br />&nbsp; &nbsp; [super viewDidUnload];<br />&nbsp; &nbsp; // Release any retained subviews of the main view.<br />&nbsp; &nbsp; // e.g. self.myOutlet = nil;<br />}<br /><br />- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation<br />{<br />&nbsp; &nbsp; // Return YES for supported orientations<br />	return YES;<br />}<br /><br />@end
    


    Ma view de calcul (CtaEteViewController).h
    #import &lt;UIKit/UIKit.h&gt;<br /><br />@interface CtaEteViewController : UIViewController {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; IBOutlet	UITextField	*fieldT1;<br />&nbsp; &nbsp; IBOutlet	UITextField	*fieldT2;<br />&nbsp; &nbsp; IBOutlet	UITextField	*fieldT3;&nbsp;  <br />}<br /><br />@property (nonatomic, retain) IBOutlet	UITextField *fieldT1;<br />@property (nonatomic, retain) IBOutlet	UITextField *fieldT2;<br />@property (nonatomic, retain) IBOutlet	UITextField *fieldT3;<br /><br />- (IBAction) calculate;<br /><br />@end<br />
    

    Ma view de calcul (CtaEteViewController).m
    #import &quot;CtaEteViewController.h&quot;<br /><br />@implementation CtaEteViewController<br /><br />@synthesize fieldT1;<br />@synthesize fieldT2;<br />@synthesize fieldT3;<br /><br />- (IBAction) calculate {<br />&nbsp; &nbsp; <br />	float a = [[fieldT1 text] floatValue];<br />	float f = [[fieldT2 text] floatValue];<br />&nbsp;  <br />&nbsp; &nbsp; //calcul de TAM<br />	float c = a+f;	<br />	fieldT3.text = [NSString stringWithFormat: @&quot;%.3f&quot;,c];	&nbsp; <br />}<br /><br />- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil<br />{<br />&nbsp; &nbsp; self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];<br />&nbsp; &nbsp; if (self) {<br />&nbsp; &nbsp; &nbsp; &nbsp; // Custom initialization<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return self;<br />}<br /><br />- (void)didReceiveMemoryWarning<br />{<br />&nbsp; &nbsp; // Releases the view if it doesn&#039;t have a superview.<br />&nbsp; &nbsp; [super didReceiveMemoryWarning];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Release any cached data, images, etc that aren&#039;t in use.<br />}<br /><br />#pragma mark - View lifecycle<br /><br />- (void)viewDidLoad<br />{<br />&nbsp; &nbsp; [super viewDidLoad];<br />&nbsp; &nbsp; // Do any additional setup after loading the view from its nib.<br />}<br /><br />- (void)viewDidUnload<br />{<br />&nbsp; &nbsp; [super viewDidUnload];<br />&nbsp; &nbsp; // Release any retained subviews of the main view.<br />&nbsp; &nbsp; // e.g. self.myOutlet = nil;<br />}<br /><br />- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation<br />{<br />&nbsp; &nbsp; // Return YES for supported orientations<br />	return YES;<br />}<br /><br />@end<br />
    


    Les liaison dans le CtaEteViewController.xib sont bien faites (pas de point d'exclamation)....



    Le message d'ereur

    2011-10-06 22:24:24.767 CFC[2769:10d03] *** Terminating app due to uncaught exception &#039;NSUnknownKeyException&#039;, reason: &#039;[&lt;CtaViewController 0x703a1f0&gt; setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key fieldT3.&#039;<br />*** Call stack at first throw:<br />
    
  • CéroceCéroce Membre, Modérateur
    06:13 modifié #13
    CtaViewController: this class is not key value coding-compliant for the key fieldT3.


    D'après le code que tu nous donnes, c'est tout à  fait exact. CtaViewController ne possède pas de variable d'instance fieldT3. Alors que CtaEteViewController, si.

    Sélectionne File's Owner et change sa classe de CtaViewController à  CtaEteViewController.
    ça m'étonne que tu n'aies pas de point d'exclamation.
  • frenchefrenche Membre
    06:13 modifié #14
    Problème solutionné.

    Voici l'ancienne version de CtaViewController.h faux
    -(IBAction)ctaete:(id)sender;<br />{<br />&nbsp; &nbsp; CtaEteViewController *ctaete = [[CtaViewControlle alloc] initWithNibName:@&quot;CtaEteViewController&quot; bundle:nil];<br />&nbsp; &nbsp; &nbsp; &nbsp; [self.navigationController pushViewController:ctaete animated:YES];<br />&nbsp; &nbsp; &nbsp; &nbsp; [ctaete release];<br />}
    


    La version modifiée

    -(IBAction)ctaete:(id)sender;<br />{<br />&nbsp; &nbsp; CtaEteViewController *ctaete = [[CtaEteViewController alloc] initWithNibName:@&quot;CtaEteViewController&quot; bundle:nil];<br />&nbsp; &nbsp; &nbsp; &nbsp; [self.navigationController pushViewController:ctaete animated:YES];<br />&nbsp; &nbsp; &nbsp; &nbsp; [ctaete release];<br />}
    


    Voilà  si ça peut rendre service à  certain qui galère comme moi...
Connectez-vous ou Inscrivez-vous pour répondre.