2014-05-07 7 views
1

Je n'arrive pas à transférer des données de mon NSArray pour remplir ma vue Table. J'ai regardé autour et essayé quelques choses différentes, mais pas de chance jusqu'à présent.Mise en place de NSArray dans TableView

Voici mon code:

#import "ListFilmController.h" 
#import <WindowsAzureMobileServices/WindowsAzureMobileServices.h> 
#import <QuartzCore/QuartzCore.h> 
#import "AppDelegate.h" 

@interface ListFilmController() 


@end 

@implementation ListFilmController 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
self = [super initWithStyle:style]; 
if (self) { 
     // Custom initialization 
} 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    MSClient *client = [(AppDelegate *) [[UIApplication sharedApplication] delegate]  client]; 

MSTable *itemTable = [client tableWithName:@"filmbuff"]; 

[itemTable readWithCompletion:^(NSArray *items, NSInteger totalCount, NSError *error) { 

    if (error) { 

     NSLog(@"Error: %@", error); 
    } 
    else { 
     _allFilms = items; 
     NSLog(@"Item inserted, array: %@", items); 
    } 

}]; 

// Uncomment the following line to preserve selection between presentations. 
// self.clearsSelectionOnViewWillAppear = NO; 

// Uncomment the following line to display an Edit button in the navigation bar for this  view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
#warning Potentially incomplete method implementation. 
    // Return the number of sections. 
    return 1; 

} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
#warning Incomplete method implementation. 
    // Return the number of rows in the section. 
    return [_allFilms count];; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier [email protected]"Cell"; 
    UITableViewCell *cell = [tableView 
          dequeueReusableCellWithIdentifier:CellIdentifier  forIndexPath:indexPath]; 

    cell.textLabel.text=[_allFilms objectAtIndex:indexPath.row]; 

    return cell; 
} 

Je tire les données du tableau d'Azure et de le transférer à un tableau. Maintenant je le veux pour que chaque cellule soit une rangée différente de ce tableau. auriez vous des idées pour faire ça?

+0

Etes-vous sûr que le tableau '_allFilms' est rempli avec des données? – Stonz2

+1

'readWithCompletion' est une tâche asynchrone, votre tableview pourrait être en cours de chargement avant d'avoir des données –

+0

Vous pouvez essayer d'initialiser votre tableau _allFilms avant la ligne" readWithCompletion ". Après cela, dans le bloc d'achèvement où vous assignez des "items" à "_allFilms" vous devriez ajouter quelque chose comme "[_myTable reloadData];". À ce stade, votre tableau _allFils est déjà rempli. – Alex

Répondre

1

Simon a la réponse dans un commentaire. Je vais le re-poster comme une réponse. (@SimonMcLoughlin, vous devriez vraiment faire cela pour que vous puissiez obtenir le crédit de réponse accepté).

Dans votre méthode viewDidLoad, vous lancez une requête asynchrone. Cette demande ne sera pas remplie avant un certain temps.

En attendant, votre application affiche la vue tabulaire. La vue de table appelle les différentes méthodes de source de données et il est dit qu'il n'y a aucune cellule à afficher.

Ce que vous voulez faire est d'ajouter un appel [myTableView reloadData] à la fin de votre bloc d'achèvement:

[itemTable readWithCompletion: 
^(NSArray *items, NSInteger totalCount, NSError *error) { 

    if (error) { 

     NSLog(@"Error: %@", error); 
    } 
    else { 
     _allFilms = items; 
     NSLog(@"Item inserted, array: %@", items); 
     [myTableView reloadData]; 
    } 
}]; 

Cela provoquera l'affichage du tableau de re-requête les méthodes de source de données numberOfSections, numberOfRowsInSection: et tableView:cellForRowAtIndexPath: et affichez le nouveau contenu dans la vue de table.

Vous pouvez également ajouter un message ou un indicateur de progression afin que l'utilisateur sache que l'application récupère des données à partir d'un serveur distant. Vous devez afficher le message/indicateur de progression lorsque vous démarrez la demande asynchrone, puis supprimez-le dans le bloc d'achèvement, juste avant d'appeler [myTableView reloadData].

0

Je ne suis pas sûr de comprendre votre problème. Je pense que je ferais quelque chose comme ceci:

#import "ListFilmController.h" 
#import <WindowsAzureMobileServices/WindowsAzureMobileServices.h> 
#import <QuartzCore/QuartzCore.h> 
#import "AppDelegate.h" 

@interface ListFilmController() 


@end 

@implementation ListFilmController 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
self = [super initWithStyle:style]; 
if (self) { 
     // Custom initialization 
} 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    MSClient *client = [(AppDelegate *) [[UIApplication sharedApplication] delegate]   client]; 

MSTable *itemTable = [client tableWithName:@"filmbuff"]; 

// Your app will not crash if it tries to populate the tableview before you get the data 
_allFilms = [NSArray new]; 

[itemTable readWithCompletion:^(NSArray *items, NSInteger totalCount, NSError *error) { 

if (error) { 

    NSLog(@"Error: %@", error); 
} 
else { 
    _allFilms = items; 
    // After populating your data array you will have to reload the table view data 
    [_tableView reloadData]; 
    NSLog(@"Item inserted, array: %@", items); 
} 

}]; 

Espérons que cela aide!

+0

Merci, a dû changer quelques choses mais cela a fonctionné. Il chargeait le tableau après la vue de la table. – dmbll