2009-06-02 6 views
2

L'UIToolBar a deux vues, un UIView avec UITextViews et un UIView w/UITableView.UIToolBar avec UITableView - TableView n'est pas actualisé lorsqu'il est chargé

UITableView qui est appelée via un UIToolBar. La première fois que UITableView se charge, il frappe la base de données et obtient l'information. Je reviens à l'UIView avec UITextViews sélectionnez des données, puis "tab" à l'UITableView, mais aucune des méthodes déléguées ne sont appelées, comme viewDidLoad ou initWithNibName ou quoi que ce soit, donc les données de la table sont périmées.

Donc, j'ai découvert la méthode

-(void)viewWillAppear:(BOOL)animated { 

est appelé, cependant, il n'a pas accès à l'tableView, comme par exemple,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

Je ne trébuche sur cette recommandation:

"I can't seem to figure out how to make the UITableView refresh ... I did find this, which seems like the same problem I'm having,

What I did is to create a MyTableViewController* property in MyModalViewController class. Before presentModalView, I store the table view controller pointer to this property in modal view controller.

Now I have a reference to table view controller when I'm in the modal view controller. Now just use this stored table view controller to locate its tableView, then reloadData.

Feels dirty but gets work done."

Si c'est la réponse, je ne suis pas sûr de savoir comment le coder.

Merci d'avance!

  • sk

Note: Je viens d'essayer ceci:

.h

UITableView *tableViewPtr; 
@property (nonatomic, retain) UITableView *tableViewPtr; 

.m

@synthesize tableViewPtr; 

et le stocker dans -

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {: 
... 
self.tableViewPtr = tableView; 
... 

ensuite essayer de l'appeler de

-(void)viewWillAppear:(BOOL)animated { 
[self.tableViewPtr reloadData]; 

Mais cela ne semble pas fonctionner.

+0

J'ai également essayé ceci: .h UITableView * tableViewPtr; @property (nonatomic, retain) UITableView * tableViewPtr; .m @synthesize tableViewPtr; Et stockez-le dans - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {: ... self.tableViewPtr = tableView; ... Ensuite, essayez de l'appeler à partir de - (void) viewWillAppear: (BOOL) animé {: [self.tableViewPtr reloadData]; Mais cela ne semble pas fonctionner. –

+0

Bon seigneur, ce dernier commentaire est détruit. Pardon. –

Répondre

0

dans la vue apparaît méthode (que je suppose est dans votre classe contrôleur) appelez

[self.tableView reloadData]; 
+0

FavoriteViewController.m: 115: erreur: demande de membre 'tableView' dans quelque chose pas une structure ou un syndicat Je n'ai pas une propriété de classe de ce nom. Quand je me réfère à tableView, je me réfère à l'argument transmis par les méthodes tableView. –

+0

votre contrôleur de vue de table devrait avoir accès à la tableView - êtes-vous dans le bon fichier ??? – zpesk

+0

Oui - Je suis dans le ViewController, qui contient un UIView et un UITableView. Ce que je ne comprends pas, c'est comment il aurait accès. Les autres méthodes dans le contrôleur, (- (UITableViewCell *) tableView: (UITableView *) tableView) doivent passer dans la tableView ... Donc ... Je ne comprends pas pourquoi j'y aurais accès. Comme je l'ai dit, je n'ai pas fait une propriété tableView pour cette classe (mais je pourrais). Mon premier article décrit ma structure de projet (UITabController w/deux UIViewControllers). –

2

Merci pour l'aide. Enfin résolu et voici le problème:

1) Mon contrôleur étendait UIViewController, pas UITableViewController.

Une fois que j'ai étendu la classe correcte, puis câblé correctement via le propriétaire du fichier et IB, cela a fonctionné. Maintenant, dans viewWillAppear, je peux appeler self.tableView reloadData.

Ne referez plus jamais cette erreur!

Merci à tous -

sk

1

Vous pouvez utiliser un UIViewController - vous avez juste besoin de mettre en œuvre les protocoles UITableViewDelegate et UITableViewDataSource.

--r

3

mr-sk: Vous avez probablement besoin d'apprendre un peu plus sur la façon dont fonctionne Objective-C. Lorsque vous déclarez le UIViewController (ou une sous-classe) vous implémentez simplement les protocoles uitableview:

@interface ViewWithTableView : UIViewController 
    <UITableViewDelegate, UITableViewDataSource> {...} 

Ensuite, vous mettre en œuvre les méthodes de protocoles nécessaires à l'intérieur de votre viewController. Il y a seulement une poignée de méthodes que vous devez implémenter pour supporter une tableView.

Si vous utilisez IB, définir votre interface comme ceci:

@interface ViewWithTableView : UIViewController 
    <UITableViewDelegate, UITableViewDataSource> { 
    IBOutlet UITableView *yourTableView; 
    . . . 
} 

et l'enregistrer, puis passez à l'IB et faites un clic droit sur le tableView. Cliquez et faites glisser les liaisons depuis DataSource et Delegate vers votre viewController (probablement le propriétaire de votre fichier). Cliquez ensuite sur viewController et tapez cmd-4. Sélectionnez "ViewWithTableView" ou ce que vous l'avez appelé dans la liste déroulante Classe dans la section Identité de classe. Sauvegardez tout et tout ira bien.

Notez que si vous ajoutez un @property pour votre tableView, vous ne serez pas appeler soi-même, car il n'y a pas accesseur:

[yourTableView whatever:withWhatever]; 

Comme tout code tapé le brassard de, votre kilométrage peut varier. : \