TabBar et Navigation Based
frenche
Membre
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 ?
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 ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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).
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]
ça ne pourrait pas venir d'ailleurs ?
Il est très peu probable que ça vienne d'autre chose que d'une vieille outlet oublié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]
- 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:
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.
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]
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)
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.
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
View principal.m
Ma view de calcul (CtaEteViewController).h
Ma view de calcul (CtaEteViewController).m
Les liaison dans le CtaEteViewController.xib sont bien faites (pas de point d'exclamation)....
Le message d'ereur
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.
Voici l'ancienne version de CtaViewController.h faux
La version modifiée
Voilà si ça peut rendre service à certain qui galère comme moi...