Actualiser un tableau depuis un fichier PLIST lui-même mis a jour depuis le Web

logikstiklogikstik Membre
02:00 modifié dans API UIKit #1
Bonjour tout le monde,

J'imagine qu'à  première vue je vais me faire huer au vue du titre :(

Je vous explique, sur l'application en cours, je récupère via une page web PHP un fichier XML dont j'enregistre  le contenu sur l'iPhone dans un fichier PLIST. Le fichier XML et formater de façon a correspondre au fichier PLIST.

De là , je parse le fichier PLIST et j'insère les données en tableau (UITableView). Jusque là  tout va bien, j'utilise le même système que le l'article suivant : "Drill down table view with a detail view" ([url=http://"http://www.iphonesdkarticles.com/2009/03/drill-down-table-view-with-detail-view.html"]ici[/url]), mais au lieu d'avoir un seul TableView, j'en utilise 3 différents (juste pour personnaliser les cellules selon l'infos). Bref tout marche encore une fois. :)

Mon problème est que j'ai un formulaire qui envoi des données sur une page Web PHP que je récupère en mettant à  jour le fichier PLIST mais le tableau refuse de se recharger sachant que le fichier PLIST se met correctement à  jour (Je vérifie que celui-ci est à  jour en regardant dedans).

Le plus simple est que je vous montre mon code car je sais pas si je suis clair là .

Fichier : SecretsAppDelegate.h
<br />#import &lt;UIKit/UIKit.h&gt;<br /><br />@class CategoriesViewController;<br />@class MessagerieViewController;<br />@class CharteViewController;<br /><br />@interface SecretsAppDelegate : NSObject &lt;UIApplicationDelegate&gt; {<br />&nbsp; &nbsp; IBOutlet UIWindow *window;<br />	IBOutlet UITabBarController *tabBarController;<br />	<br />	NSMutableDictionary *data;<br />	NSString *filePath;<br />	<br />	CategoriesViewController *categoriesViewController;<br />	MessagerieViewController *messagerieViewController;<br />	CharteViewController *charteViewController;<br />}<br /><br />@property (nonatomic, retain) IBOutlet UIWindow *window;<br />@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;<br /><br />@property (nonatomic, retain) NSMutableDictionary *data;<br />@property (nonatomic, retain) NSString *filePath;<br /><br />- (void)reloadAllDatas;<br /><br />@end<br />


Fichier : SecretsAppDelegate.m
<br />- (void)applicationDidFinishLaunching:(UIApplication *)application {&nbsp; &nbsp; <br />	tabBarController = [[UITabBarController alloc] init];&nbsp; &nbsp; &nbsp; &nbsp; <br />	<br />	categoriesViewController = [[CategoriesViewController alloc] init];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <br />	UINavigationController *tableNavOneController = [[[UINavigationController alloc] initWithRootViewController:categoriesViewController] autorelease];<br />	[categoriesViewController release];<br />	[tableNavOneController setNavigationBarHidden:FALSE];<br />	<br />	messagerieViewController = [[MessagerieViewController alloc] init];&nbsp; <br />	UINavigationController *tableNavTwoController = [[[UINavigationController alloc] initWithRootViewController:messagerieViewController] autorelease];<br />	[messagerieViewController release];<br />	[tableNavTwoController setNavigationBarHidden:FALSE];<br />	<br />	charteViewController = [[CharteViewController alloc] init];&nbsp; <br />	UINavigationController *tableNavThreeController = [[[UINavigationController alloc] initWithRootViewController:charteViewController] autorelease];<br />	[charteViewController release];<br />	[tableNavThreeController setNavigationBarHidden:FALSE];<br />	<br />	tabBarController.viewControllers = [NSArray arrayWithObjects:tableNavOneController, tableNavTwoController, tableNavThreeController, nil];<br />	<br />	[self reloadAllDatas];<br />	<br />	[window addSubview:tabBarController.view];<br />	[window makeKeyAndVisible];<br />}<br /><br />- (void)reloadAllDatas {<br />	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br />	NSString *documentsDirectory = [paths objectAtIndex:0];<br />	filePath = [documentsDirectory stringByAppendingPathComponent:@&quot;monfichier.plist&quot;];<br />	<br />	NSURL *url = [NSURL URLWithString:@&quot;http://www.monlienweb.com/monfichier.php&quot;];<br />	ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:url] autorelease];<br />	[request start];<br />	<br />	NSURL *urltwo = [NSURL URLWithString:@&quot;http://www.monlienweb.com/monfichier.xml&quot;];<br />	ASIHTTPRequest *requesttwo = [[[ASIHTTPRequest alloc] initWithURL:urltwo] autorelease];<br />	[requesttwo setDownloadDestinationPath:filePath];<br />	[requesttwo start];<br />	<br />	NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];<br />	self.data = tempDict;<br />	[tempDict release];<br />}


Ceci est mon troisième TableView qui récupère les informations
<br />- (void)viewDidLoad {<br />&nbsp; &nbsp; &nbsp; &nbsp; [super viewDidLoad];<br />	[self reloadAllData];<br />}<br /><br />- (void)reloadAllData {<br />	SecretsAppDelegate *appDelegate = (SecretsAppDelegate *)[[UIApplication sharedApplication] delegate];<br />	[(SecretsAppDelegate *)appDelegate reloadAllDatas];<br />	<br />&nbsp; &nbsp; &nbsp; &nbsp; self.tableDataSource = nil;<br />	<br />	if(CurrentLevel == 0) {<br />		NSArray *tempArray = [[NSArray alloc] init];<br />		self.tableDataSource = tempArray;<br />		[tempArray release];<br />		<br />		self.tableDataSource = [appDelegate.data objectForKey:@&quot;Rows&quot;];<br />		<br />		[self.tableView reloadData];<br />	}<br />}<br />



Mon fichier qui est censé rafraichir le tableau une fois l'ajout terminer
<br />- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {<br />	NSLog(@&quot;data : %@&quot;, [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);<br />	NSString *response = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];<br />	<br />	SecretsAppDelegate *appDelegate = (SecretsAppDelegate *)[[UIApplication sharedApplication] delegate];<br />	[(SecretsAppDelegate *)appDelegate reloadAllDatas];<br />		<br />	TopicsViewController *topicsViewController = [[TopicsViewController alloc]init];<br />	[topicsViewController.topicsTable reloadData];<br />		<br />	[self.navigationController dismissModalViewControllerAnimated:YES];<br />}<br />


Après je sais pas s'il est possible d'actualiser les données sachant qu'elles se trouvent toutes dans un seul et même fichier. Mais perso, je pense que j'y arriverai pas même si tout était séparé en 3 fichiers.

Voilà , en espérant ne pas trop donner de fil à  retordre :P

Guillaume

Réponses

  • Philippe49Philippe49 Membre
    02:00 modifié #2
    Bienvenu !

    dans 1249227734:

    J'imagine qu'à  première vue je vais me faire huer au vue du titre :(

    Oui !
    A priori pourquoi ne pas stocker le plist dans des NSMutableArray, changer les NSMutableArray, et quand tu le désires, peut-être seulement en fin, recopier les NSMutableArray dans les plist ?

    dans 1249227734:

    Mon problème est que j'ai un formulaire qui envoi des données sur une page Web PHP que je récupère en mettant à  jour le fichier PLIST mais le tableau refuse de se recharger sachant que le fichier PLIST se met correctement à  jour (Je vérifie que celui-ci est à  jour en regardant dedans).


    N'est-ce pas un problème de synchronisation (atends-tu bien que le chargement soit terminé pour faire reloadAllDatas) ?
    Fais-tu bien aussi [tableView reloadData] sur les table view qui le nécessitent ?

  • Philippe49Philippe49 Membre
    02:00 modifié #3
    Attention, également à  l'appel de
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    le data attendu n'est pas forcément totalement acheminé. Il est plus prudent de faire un NSMutableData et d'y ajouter peu à  peu les données reçues.
    voir

  • logikstiklogikstik Membre
    02:00 modifié #4
    Merci pour ta réponse, mais je suis pas sur de bien comprendre en fait le principe. J'ai revu le code mais évidemment, ça ne marche toujours pas, le fichier se met bien à  jour met pas le tableau.

    <br />- (void)viewDidLoad {<br />&nbsp; &nbsp; [super viewDidLoad];<br />	<br />	sujet.delegate = self;<br />	message.delegate = self;<br />	<br />	self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@&quot;Annuler&quot; style:UIBarButtonItemStyleBordered target:self action:@selector(cancel_Clicked:)] autorelease];<br />	self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@&quot;Ajouter&quot; style:UIBarButtonItemStyleBordered target:self action:@selector(validate)] autorelease];<br />}<br /><br />- (BOOL)textFieldShouldReturn:(UITextField *)TextField {<br />	[TextField resignFirstResponder];<br />	[self validate];	<br />	<br />	return YES;<br />}<br /><br />- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {<br />	[sujet resignFirstResponder];<br />	[message resignFirstResponder];<br />}<br /><br />- (void)validate {<br />	if (sujet.text.length &lt; 1 || message.text.length &lt; 1) {<br />		[[[UIAlertView alloc] initWithTitle:@&quot;&quot; message:@&quot;Tous les champs sont obligatoires&quot; delegate:self cancelButtonTitle:@&quot;Ok&quot; otherButtonTitles:nil, nil] show];<br />	}<br />	else {<br />		NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];<br />		NSString *username = [userDefaults stringForKey:@&quot;username&quot;];<br />		<br />		if (abonner.on) {<br />			valueAbonner = @&quot;1&quot;;<br />		}<br />		else {<br />			valueAbonner = @&quot;0&quot;;<br />		}<br />		<br />		NSString *postBody = [NSString stringWithFormat:@&quot;req_subject=%@&amp;req_message=%@&amp;form_user=%@&amp;fid=%@&amp;form_sent=1&amp;subscribe=%@&quot;, <br />							 [sujet.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], <br />							 [message.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],<br />							 [username stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],<br />							 [fid stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],<br />							 [valueAbonner stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]<br />		];<br />		<br />		NSString *addPostURLString = @&quot;http://www.monsite.com/monfichier.php&quot;;<br />		<br />		NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:addPostURLString]];<br />		[request setHTTPShouldHandleCookies:YES];<br />		[request setHTTPMethod:@&quot;POST&quot;];<br />		[request setHTTPBody: [postBody dataUsingEncoding:NSUTF8StringEncoding]];<br />		<br />		NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];	<br />		<br />		if (connection) {<br />			receivedData = [[NSMutableData alloc] retain];<br />			<br />			UIActivityIndicatorView *activityIndicatorView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];<br />			[activityIndicatorView startAnimating];<br />			UIBarButtonItem *activityItem = [[UIBarButtonItem alloc] initWithCustomView:activityIndicatorView];<br />			[activityIndicatorView release];<br />			self.navigationItem.rightBarButtonItem = activityItem;<br />			self.navigationItem.leftBarButtonItem.enabled = FALSE;<br />			sujet.enabled = FALSE;<br />			abonner.enabled = FALSE;<br />			message.editable = NO;<br />			<br />			[activityItem release];<br />		}<br />		else {<br />			NSLog(@&quot;Erreur avec la connection&quot;);<br />		}<br />	}<br />}<br /><br />- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {<br />	[receivedData setLength:0];<br />}<br /><br />- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {<br />	[receivedData appendData:data];<br />}<br /><br />- (void)connectionDidFinishLoading:(NSURLConnection *)connection {	<br />	[self setReloadAll:receivedData];<br />	<br />	self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@&quot;Ajouter&quot; style:UIBarButtonItemStyleBordered target:self action:@selector(validate)] autorelease];<br />	self.navigationItem.leftBarButtonItem.enabled = TRUE;<br />	sujet.enabled = TRUE;<br />	abonner.enabled = TRUE;<br />	message.editable = YES;<br />	<br />	[connection release];<br />	[receivedData release];<br />}<br /><br />- (void)setReloadAll:(NSData *)data {<br />	NSString *reponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];<br />	<br />	if ([reponse intValue] == 1) {<br />		SecretsAppDelegate *appDelegate = (SecretsAppDelegate *)[[UIApplication sharedApplication] delegate];<br />		[(SecretsAppDelegate *)appDelegate reloadAllDatas];<br />		<br />		TopicsViewController *topicsViewController = [[TopicsViewController alloc] init];<br />		[topicsViewController reloadAllData];<br />		[topicsViewController.topicsTable reloadData];<br />		<br />		[self.navigationController dismissModalViewControllerAnimated:YES];<br />	}<br />	else {<br />		[[[UIAlertView alloc] initWithTitle:@&quot;&quot; message:reponse delegate:self cancelButtonTitle:@&quot;Ok&quot; otherButtonTitles:nil, nil] show];<br />	}<br />}<br />
    


    Et là , la partie du fichier TopicsViewController.m qui est censé rafraà®chir les infos :

    <br />- (void)reloadAllData {<br />	SecretsAppDelegate *appDelegate = (SecretsAppDelegate *)[[UIApplication sharedApplication] delegate];<br />	[(SecretsAppDelegate *)appDelegate reloadAllDatas];<br />	self.tableDataSource = nil;<br />	<br />	if(CurrentLevel == 0) {<br />		NSArray *tempArray = [[NSArray alloc] init];<br />		self.tableDataSource = tempArray;<br />		[tempArray release];<br />		<br />		self.tableDataSource = [appDelegate.data objectForKey:@&quot;Rows&quot;];<br />		<br />		[self.topicsTable reloadData];<br />	}<br />}<br />
    


    J'admet que je suis dessus depuis maintenant plusieurs jours, mais je ne comprend pas vraiment comment ré-actualiser le tout.

    Guillaume
  • Philippe49Philippe49 Membre
    02:00 modifié #5
    Bon, en première lecture, je vois
    <br />	NSString *reponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];<br />	<br />	if ([reponse intValue] == 1) {
    

    Cela veut dire sans doute que tu fais un test en mettant simplement "1" comme texte à  réceptionner, ou à  la rigueur "1" suivi de lettres.


    Je vois plus loin 
    TopicsViewController *topicsViewController = [[TopicsViewController alloc] init];<br />		[topicsViewController reloadAllData];
    

    Tu crées ainsi une seconde instance de TopicsViewController, et la table topicsViewController.topicsTable ne doit pas être celle de ton interface ? Il faut s'arranger pour reprendre ici le topicsViewController déjà  créé et dont la table est installée sur l'interface.
  • logikstiklogikstik Membre
    02:00 modifié #6
    Exact, la réponse du fichier PHP est bien un "1" tout simple, sinon cela veut dire que c'est un message d'erreur.

    Pour ceux qui est de "topicsTable", il s'agit bien du tableau de TopicsViewController, j'ai bien penser a le relier depuis Interface Builder.

    Je sais plus si je l'est dit, mais toutes mes informations se trouvent dans un seul et même fichier PLIST, je me demande si le problème viendrait pas de là , et que le mieux et que je sépare en 3 fichier.
  • Philippe49Philippe49 Membre
    02:00 modifié #7
    dans 1249237400:

    Pour ceux qui est de "topicsTable", il s'agit bien du tableau de TopicsViewController, j'ai bien penser a le relier depuis Interface Builder.

    Ah non, pas du tout . Ecrit comme cela tu crées une nouvelle instance, et la topicTable est en l'air.
    Fais NSLog(@%@",topicsViewController.topicsTable) , tu devrais avoir (null) comme réponse ici.

    dans 1249237400:

    Je sais plus si je l'est dit, mais toutes mes informations se trouvent dans un seul et même fichier PLIST, je me demande si le problème viendrait pas de là , et que le mieux et que je sépare en 3 fichier.

    Non, ce n'est pas la raison, cela complique sans doute et peut par conséquent être plus facilement source d'erreur, mais ce n'est pas une raison fondamentale.
  • logikstiklogikstik Membre
    août 2009 modifié #8
    Bien vu, il me retourne bien "null", j'ai essayer aussi en rajoutant un "@class TopicsViewController;" et "TopicsViewController *topicsViewController;" dans le fichier AddPostViewController.h mais pareil, il me retourne "null".

    Comment je dois procéder pour renvoyer une instance avant ouverture du formulaire j'imagine ?

    Sinon, je viens de tomber sur cette article, ça pourrait m'aider à -t-on avis ?

    http://www.oni-ecchi.info/blog/iphone/iphone-delegate.html
  • Philippe49Philippe49 Membre
    02:00 modifié #9
    dans 1249238437:

    Bien vu, il me retourne bien "null", j'ai essayer aussi en rajoutant un "@class TopicsViewController;" et "TopicsViewController *topicsViewController;" dans le fichier AddPostViewController.h mais pareil, il me retourne "null".

    Comment je dois procéder pour renvoyer une instance avant ouverture du formulaire j'imagine ?

    Oui c'est un bon début :
    dans le .h, si ton topicsViewController est instancié  dans IB
    <br />&quot;@class TopicsViewController;<br />@interface .....<br />{<br />&nbsp;  TopicsViewController *topicsViewController;<br />&nbsp;  ...<br />}<br />@property (nonatomic,retain) IBOutlet&nbsp; TopicsViewController *topicsViewController;<br />...<br />
    

    Faire la connection dans Interface Builder.


    Après dans le code, il suffit de mettre d'une part
    @synthesize topicsViewController

    d'autre part; remplacer
    TopicsViewController *topicsViewController = [[TopicsViewController alloc] init];<br />		[topicsViewController reloadAllData];<br />		[topicsViewController.topicsTable reloadData];<br />
    


    par un simple
    <br />		[topicsViewController.topicsTable reloadData];<br />
    


    Bon, je suis absent 2 petites heures ... Bon courage.


    Et prends au passage l'astuce du NSLog(@%@",unObjet) cela permet de vérifier plein de trucs à  l'exécution ...
  • logikstiklogikstik Membre
    août 2009 modifié #10
    Je te remercie vraiment de prendre du temps pour m'aider, mais toujours pareil, ça me renvoi toujours un "null", mon formulaire est une fenêtre modale, peut être y a-t-il une solution plus adapté. Je continue de chercher au cas où que je trouve :)

    Mais je sais pas à  quoi relier "topicsViewController" dans Interface Builder.
  • Philippe49Philippe49 Membre
    02:00 modifié #11
    dans 1249239762:

    Mais je sais pas à  quoi relier "topicsViewController" dans Interface Builder.

    Ta table view, elle est installée dans le xib principal ou dans un xib secondaire ?
  • logikstiklogikstik Membre
    02:00 modifié #12
    Le tableview est dans un xib secondaire mais c'est peut ça le problème. Je vais voir pour mettre le tout dans un seul xib, du moins le tableview et le formulaire.
  • Philippe49Philippe49 Membre
    août 2009 modifié #13
    Non ce n'est pas un problème, c'est même plutôt mieux. Dans ce cas le File's owner du xib doit être un TopicsViewController, les outlets, delegate, datasource connectés dans le xib.
    L'instance topicsViewController est dans le xib principal avec la connexion vers ce topic. EN aucun cas, il ne faut alors créer de TopicsViewController dans ton code : tu n'en créerais pas un second par erreur dans viewDidLoad ?
  • logikstiklogikstik Membre
    02:00 modifié #14
    Non, enfin je crois pas :

    La partie qui parse le fichier PLIST
    <br />- (void)reloadAllDatas {<br />	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br />	NSString *documentsDirectory = [paths objectAtIndex:0];<br />	filePath = [documentsDirectory stringByAppendingPathComponent:@&quot;monfichier.plist&quot;];<br />	<br />	NSURL *url = [NSURL URLWithString:@&quot;http://www.monsite.com/mapage.php&quot;];<br />	ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:url] autorelease];<br />	[request start];<br />	<br />	NSURL *urltwo = [NSURL URLWithString:@&quot;http://www.monsite.com/monfichier.xml&quot;];<br />	ASIHTTPRequest *requesttwo = [[[ASIHTTPRequest alloc] initWithURL:urltwo] autorelease];<br />	[requesttwo setDownloadDestinationPath:filePath];<br />	[requesttwo start];<br />	<br />	NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];<br />	self.data = tempDict;<br />	[tempDict release];<br />}<br />
    


    Ca c'est le code de TopicViewController.m
    <br />- (void)viewDidLoad {<br />&nbsp; &nbsp; &nbsp; &nbsp; [super viewDidLoad];<br />	<br />	self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:self action:@selector(addPost:)] autorelease];<br />	<br />	[self reloadAllData];<br />}<br /><br />- (void)reloadAllData {	<br />	if(CurrentLevel == 0) {<br />		NSMutableArray *tempArray = [[NSMutableArray alloc] init];<br />		self.tableDataSource = tempArray;<br />		[tempArray release];<br />		<br />		SecretsAppDelegate *appDelegate = (SecretsAppDelegate *)[[UIApplication sharedApplication] delegate];<br />		[appDelegate reloadAllDatas];<br />		self.tableDataSource = [appDelegate.data objectForKey:@&quot;Rows&quot;];<br />		<br />		[self.topicsTable reloadData];<br />	}<br />}<br /><br />- (void)addPost:(id)sender {<br />	if(addPostViewController == nil) {<br />		addPostViewController = [[AddPostViewController alloc] initWithNibName:@&quot;AddPostView&quot; bundle:[NSBundle mainBundle]];<br />		addPostViewController.fid = fid;<br />	}<br />	<br />	if(infoNavController == nil) {<br />		infoNavController = [[UINavigationController alloc] initWithRootViewController:addPostViewController];<br />	}<br />	<br />	[self.navigationController presentModalViewController:infoNavController animated:YES];	<br />}<br />
    


    Le code de AddPostviewController.m exécuté une fois la connection terminer

    <br />- (void)setReloadAll:(NSData *)data {<br />	NSString *reponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];<br />	<br />	if ([reponse intValue] != 1) {<br />		SecretsAppDelegate *appDelegate = (SecretsAppDelegate *)[[UIApplication sharedApplication] delegate];<br />		[(SecretsAppDelegate *)appDelegate reloadAllDatas];<br />		<br />		// TopicsViewController *topicsViewController = [[TopicsViewController alloc] init];<br />		[topicsViewController reloadAllData];<br />		[topicsViewController.topicsTable reloadData];<br />		NSLog(@&quot;%@&quot;, topicsViewController.topicsTable);<br />		<br />		[self.navigationController dismissModalViewControllerAnimated:YES];<br />	}<br />	else {<br />		[[[UIAlertView alloc] initWithTitle:@&quot;&quot; message:reponse delegate:self cancelButtonTitle:@&quot;Ok&quot; otherButtonTitles:nil, nil] show];<br />	}<br />}<br />
    


    Comme tu vois dans le fichier AddPostViewController.m, il ya ce code qui permet de remettre à  jour le fichier PLIST avec les dernières informations, notamment celles envoyés par le formulaire via l'iPhone

    <br />SecretsAppDelegate *appDelegate = (SecretsAppDelegate *)[[UIApplication sharedApplication] delegate];<br />[(SecretsAppDelegate *)appDelegate reloadAllDatas];<br />
    


    Cette partie marche très bien, puisque le fichier se met correctement à  jour, mais là  je me demande si le problème ne viendrai pas de là  en fait :
    <br />- (void)reloadAllData {	<br />	if(CurrentLevel == 0) {<br />		NSMutableArray *tempArray = [[NSMutableArray alloc] init];<br />		self.tableDataSource = tempArray;<br />		[tempArray release];<br />		<br />		SecretsAppDelegate *appDelegate = (SecretsAppDelegate *)[[UIApplication sharedApplication] delegate];<br />		[appDelegate reloadAllDatas];<br />		self.tableDataSource = [appDelegate.data objectForKey:@&quot;Rows&quot;];<br />		<br />		[self.topicsTable reloadData];<br />	}<br />}<br />
    


    J'ai l'impression que "self.tableDataSource", ne se met pas a jour lui par contre. Je divague certainement, mais c'est ce qui me vient à  l'esprit pour le moment.

    Une dernière chose, je sais pas si ça parait important, mais le "style" du fichier PLIST :

    <br />&lt;plist&gt;<br />&nbsp; &lt;dict&gt;<br />&nbsp; &nbsp; &lt;key&gt;Rows&lt;/key&gt;<br />&nbsp; &nbsp; &lt;array&gt;<br />&nbsp; &nbsp; &nbsp; &lt;dict&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;key&gt;Title&lt;/key&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;string&gt;Ma première page&lt;/string&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;key&gt;Children&lt;/key&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;array&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;dict&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;key&gt;Title&lt;/key&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;string&gt;Ma seconde page&lt;/string&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;key&gt;Children&lt;/key&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;array&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;dict&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;key&gt;Title&lt;/key&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;string&gt;Ma troisième page&lt;/string&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/dict&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/array&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/dict&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;/array&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/dict&gt;<br />&nbsp; &nbsp; &lt;/array&gt;<br />&nbsp; &lt;/dict&gt;<br />&lt;/plist&gt;<br />
    
  • Philippe49Philippe49 Membre
    02:00 modifié #15
    dans 1249285718:

    Cette partie marche très bien, puisque le fichier se met correctement à  jour, mais là  je me demande si le problème ne viendrai pas de là  en fait :
    <br />- (void)reloadAllData {	<br />	if(CurrentLevel == 0) {<br />		NSMutableArray *tempArray = [[NSMutableArray alloc] init];<br />		self.tableDataSource = tempArray;<br />		[tempArray release];<br />		<br />		SecretsAppDelegate *appDelegate = (SecretsAppDelegate *)[[UIApplication sharedApplication] delegate];<br />		[appDelegate reloadAllDatas];<br />		self.tableDataSource = [appDelegate.data objectForKey:@&quot;Rows&quot;];<br />		<br />		[self.topicsTable reloadData];<br />	}<br />}<br />
    


    J'ai l'impression que "self.tableDataSource", ne se met pas a jour lui par contre. Je divague certainement, mais c'est ce qui me vient à  l'esprit pour le moment.


    NSLog(@%@",self.tableDataSource) cela donne quoi ?

  • Philippe49Philippe49 Membre
    02:00 modifié #16
    Dans
    <br />NSMutableArray *tempArray = [[NSMutableArray alloc] init];<br />		self.tableDataSource = tempArray;<br />		[tempArray release];<br />		<br />		SecretsAppDelegate *appDelegate = (SecretsAppDelegate *)[[UIApplication sharedApplication] delegate];<br />		[appDelegate reloadAllDatas];<br />		self.tableDataSource = [appDelegate.data objectForKey:@&quot;Rows&quot;];
    


    La partie
    NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    self.tableDataSource = tempArray;
    [tempArray release];
    ne sert strictement à  rien. Puisque plus loin tu fais pointer self.tableDataSource vers self.tableDataSource = [appDelegate.data objectForKey:@Rows];


    La property tableDataSource est dans quel mode ?
  • logikstiklogikstik Membre
    août 2009 modifié #17
    Le mode de tableDataSource est :
    "NSMutableArray *tableDataSource;"
    "@property (nonatomic, retain) NSMutableArray *tableDataSource;"
  • Philippe49Philippe49 Membre
    02:00 modifié #18
    et le NSLog(@%@",self.tableDataSource); il te donne bien ce que tu attends ?
  • logikstiklogikstik Membre
    02:00 modifié #19
    Il me renvoi toutes les informations dans un tableau, il me renvoi ce qu'il faut, oui.

    Par contre, NSLog(@%@, topicsViewController.topicsTable); me renvoi toujours null" :(
  • Philippe49Philippe49 Membre
    02:00 modifié #20
    Bon cela s'éclaircit  :)

    TopicsViewController est une sous classe de UIViewController ou de UITableViewController ?

    topicsTable est bien une property dans TopicsViewController ?

  • logikstiklogikstik Membre
    02:00 modifié #21
    TopicsViewController est une sous classe de UITableViewController et la proprety : "@property (nonatomic, retain) IBOutlet UITableView *topicsTable;"
  • Philippe49Philippe49 Membre
    02:00 modifié #22
    Je joins un xib simple pour un UITableViewController ou on a seulement besoin d'une tableview. Regarde les connexions et compare avec les tiennes.

    Le code de l'interface :
    <br />@interface DisplayTableViewController : UITableViewController {<br />	UITableView * tableView;<br />	NSArray * datasource;<br />}<br />@property (nonatomic,retain) IBOutlet UITableView * tableView;<br />@property (nonatomic,retain) NSArray * datasource;
    
  • logikstiklogikstik Membre
    02:00 modifié #23
    C'est bon, tout est correctement relié, mais mes informations s'affichent bien dans le tableView, c'est juste que après l'ajout d'un message, le formulaire ce ferme (fenêtre modale), et le tableView qui est derrière ne se met pas à  jour avec le message envoyé.

    Sinon, si possible, je peut te montrer via iChat en partage écran, mon appli et tu verras par toi même ?
  • Philippe49Philippe49 Membre
    02:00 modifié #24
    dans 1249291084:

    C'est bon, tout est correctement relié, mais mes informations s'affichent bien dans le tableView, c'est juste que après l'ajout d'un message, le formulaire ce ferme (fenêtre modale), et le tableView qui est derrière ne se met pas à  jour avec le message envoyé.


    et topicsViewController est le datasource des deux table view ?
    Si c'est le cas il doit avoir deux outlets vers chacune de ces tables, et faire un reloadData sur chacune d'elles.

    Si ce n'est pas trop confidentiel, tu peux m'envoyer par MP ton code
  • Philippe49Philippe49 Membre
    02:00 modifié #25
    Je crois comprendre : dans ta vue modale (AddPostViewController) tu as une instance de TopicsViewController, avec une array tableDataSource, et qui pointe sur une tableView topicsTable dans la vue modale. Avec le reloadData, tu demandes à  la table view de se recharger.
    Maintenant, tu me dis qu'il y a une autre table view, bon, sans doute dans la vue parente de cette vue modale. Mais si un topicsViewController pointe sur cette table view, il ne s'agit pas de l'instance que tu as dans la vue modale. La table view n'a donc pas reçu de reloadData, car c'est un autre couple (topicsViewController,topicsTable).



    Anomalie au moins au niveau de la gestion mémoire
    Dans TopicsViewController.h, on a
    @property (nonatomic, retain) IBOutlet AddPostViewController *addPostViewController;

    et dans AddPostViewController.h, on a
    @property (nonatomic, retain) IBOutlet TopicsViewController *topicsViewController;

  • logikstiklogikstik Membre
    02:00 modifié #26
    Sinon, je pensais à  un truc là . Là  toutes mes informations sont contenu dans un seul tableau "tableDataSource" (catégories, sous-catégories et messages).

    Je me disais à  la limite, de séparé le contenu, un tableau pour chaque informations, avoir quelque chose de bien distinct. Ensuite, pour le formulaire, je supprime la fenêtre modale (qui pose bien des souchis :) ) et à  la place, je met un uialertview avec un textfiel et un textview, au moment de l'ajout, j'ajoute une nouvelle entrée dans le tableau message et recharge la vue.

    Les informations se mettront à  jour au prochain démarrage de l'application, donc ce qui évite de toujours se connecter au Net pour si ou ça.

    T'en penses quoi ?
  • Philippe49Philippe49 Membre
    02:00 modifié #27
    dans 1249299093:

    T'en penses quoi ?


    J'en pense deux choses :
    1) L'architecture de tes vues & controllers est effectivement très "mélangée".
    Remettre les choses à  plat en définissant un seul emplacement pour le model (les data), redéfinir exactement les rôles pour chacun des view controllers, prendre un papier, un crayon et faire un schéma ne peut que t'éclaircir les idées.

    2) Ce que tu as fais là  est probablement un premier galop d'essai qui t'a familiarisé avec pas mal de choses.

    3) Bien penser aux concepts de la programmation objet : Différence entre classe et instance, schéma Model-View-Controller, ...

    4) Vérifier le fonctionnement au fur et à  mesure, parce que là  tu avais déjà  un beau "meuble" difficile à  démêler ...

    Donc oui, si tu as le temps, tu gagneras beaucoup à  remettre tout cela à  plat, en perdant peut-être une journée au départ, mais en regagnant ensuite en travaillant sur de bons principes.
  • logikstiklogikstik Membre
    02:00 modifié #28
    1) L'architecture de tes vues & controllers est effectivement très "mélangée".
    Remettre les choses à  plat en définissant un seul emplacement pour le model (les data), redéfinir exactement les rôles pour chacun des view controllers, prendre un papier, un crayon et faire un schéma ne peut que t'éclaircir les idées.


    Je suis d'accord avec toi, j'ai déjà  commencer à  mettre à  plat ce que je souhaite et essayer de relier le tout sur papier.

    2) Ce que tu as fais là  est probablement un premier galop d'essai qui t'a familiarisé avec pas mal de choses.


    Exact  :), à  vrai dire j'ai commencer il y a pas plus de 15 jours.  :P

    3) Bien penser aux concepts de la programmation objet : Différence entre classe et instance, schéma Model-View-Controller, ...


    Etant à  l'origine développeur Web (PHP, MySQL, Zend, Javascript/Ajax, ...), je devrais pouvoir mieux m'organiser, quitte a créer des groupes de dossiers pour bien distinguer le tout.

    4) Vérifier le fonctionnement au fur et à  mesure, parce que là  tu avais déjà  un beau "meuble" difficile à  démêler ...


    Pourtant, j'ai vérifier au fur et a mesure, mais je crois que j'ai voulu aller trop vite. Je crois qu'avant de vouloir apprendre trop de chose à  la fois, vaudrait approfondir mes bases et me "stabilisé"

    Donc oui, si tu as le temps, tu gagneras beaucoup à  remettre tout cela à  plat, en perdant peut-être une journée au départ, mais en regagnant ensuite en travaillant sur de bons principes.


    Je recommencerai l'appli de toute façon et repartant avec un esprit clair et précis.

    En tout cas, je te remercie vraiment du temps que tu as pris pour m'aider, je n'hésiterai pas à  revenir si jamais j'ai besoin d'un coup de pouce, encore merci 
  • logikstiklogikstik Membre
    02:00 modifié #29
    De retour, j'ai finalement réussi, j'avais mis mes views au mauvais endroit, donc du coup elle cherchait des fonctions dans le vide sidérale lol.

    Juste un dernier problème, l'appli marche très bien, mais quand je test sur le device et que je coupe le wifi pour tester en 3G, l'appli se lance, bloque et se ferme aussitôt !? Une idée de ce qui peut faire planter comme ça ?
Connectez-vous ou Inscrivez-vous pour répondre.