6
votes

Changement de contenu de l'utableview de manière dynamique

J'ai un objet Nsurl qui obtient des données de mon site, en fonction d'une variable saisie par l'utilisateur dans la barre de recherche.

J'ai divisé ces données en Nsarray.

Une fois que j'ai fait cela, je souhaite afficher les données dans un UitailView.

Ma question est-ce. Est-il possible de charger les données dans une vision utile de manière dynamique?

I.e. Charges de programme, aucune donnée afin que UitableView est vide, puis l'utilisateur recherche une variable. Obtient des données et le contenu est chargé dans l'UitailView. Recherche une nouvelle variable, les anciennes données sont effacées à partir d'UitailView et les nouvelles données sont ajoutées?

J'essaie actuellement de faire cela à l'aide de Builder d'interface, mais de craindre que je puisse devoir rendre mon interface de manière pragmatique, afin que je puisse détruire et recréer l'utableview, mais je ne suis pas sûr.

Merci pour toute aide.


0 commentaires

3 Réponses :


9
votes

Assurez-vous que la méthode ReloaderData sur UitailView fera le tour


2 commentaires

Je vais ajouter une clarification à mon message original sur la raison pour laquelle je ne pense pas pouvoir utiliser Reloaderdata.


Lors de l'inspection ultérieure, et trouver un didacticiel relatif à ce que je veux faire, je vais avoir l'air très stupide si j'essaie de justifier de ne pas utiliser Reloaderdata. Désolé pour la question inutile.



3
votes

La peur non, la sous-classement utableview est très facile. Dans XCode, choisissez simplement un nouveau fichier, choisissez "CoCoA Touch Classes", "Classe de l'objectif-C" et dans la "sous-classe" Pick Dropdown "UitailView". Xcode ajoutera une sous-classe UitaireViewController avec des talons pour construire.

I Rempli dans un exemple très simple qui dessine les données de la table à partir d'une matrice et est affichée à partir du délégué de l'application. Comme vous avez suggéré l'envoi d'un message reloaddata à l'UitailView rafraîchra les données affichées. P>

Comme vous l'avez probablement découvert, l'utilisation d'InterfaceBuilder pour ce travail est beaucoup plus difficile que de le faire de manière programmative. P>

Cheers, Niels P>

//
//  MyTableViewController.m
//  TableView
//
//  Created by Niels Castle on 7/15/09.
//  Copyright 2009 Castle Andersen ApS. All rights reserved.
//

#import "MyTableViewController.h"


@implementation MyTableViewController

// Initializer do custom initialisation here
- (id)initWithStyle:(UITableViewStyle)style {
    if (self = [super initWithStyle:style]) {

      // This is the source of my data. The simplest source possible,
      // an NSMutableArray, of name. This would be the data from your web site
       array = [[NSMutableArray alloc]
        initWithObjects:@"Niels", @"Camilla", @"William", nil];
    }
    return self;
}


// How many section do we want in our table
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


// Customize the number of rows in the table view
// Simply the number of elements in our array of names
- (NSInteger)tableView:(UITableView *)tableView
    numberOfRowsInSection:(NSInteger)section {
    return [array count];
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView
    cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   // Reuse cells 
   static NSString *id = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:id];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc]
            initWithStyle: UITableViewCellStyleDefault
            reuseIdentifier:CellIdentifier] autorelease];
    }

   // Simplest possible cell - displaying a name from our name array
   [[cell textLabel] setText: [array objectAtIndex:[indexPath row]]];

    return cell;
}

- (void)dealloc {
   [super dealloc];
   [array release];
}

@end


//
//  TableViewAppDelegate.m
//  TableView
//
//  Created by Niels Castle on 7/15/09.
//  Copyright Castle Andersen ApS 2009. All rights reserved.
//

#import "TableViewAppDelegate.h"
#import "MyTableViewController.h"

@implementation TableViewAppDelegate

@synthesize window;


- (void)applicationDidFinishLaunching:(UIApplication *)application {    

   MyTableViewController *twc = [[MyTableViewController alloc]
      initWithStyle: UITableViewStylePlain];
   [window addSubview: [twc view]];

    [window makeKeyAndVisible];
}


- (void)dealloc {
    [window release];
    [super dealloc];
}


@end


0 commentaires

0
votes

C'est un peu compliqué, mais ma solution qui fonctionne très fiabilité est la suivante: (Supposons que vous avez un tableau comme bande de tableaux, chacun représente une section et contient des éléments qui se trouvent en fait des rangées dans le tableau).

Cet exemple convient à la situation, lorsque nous chargons certaines données du serveur (par exemple, JSON) et le résultat peut être très différent du nombre de sections et / ou de lignes. p>

Fonction vide, vous pouvez l'omettre P>

-(void)addToPropertiesTable {

    //fullTableData is above mentioned two dimensional array 
    int sectionsCount = _fullTableData.count;
    int count = 0;
    NSMutableArray *insertIndexPaths = [NSMutableArray array];
    NSMutableArray *deleteIndexPaths = [NSMutableArray array];

    for(int j = 0; j < sectionsCount; j++) {
        NSMutableArray *currentAdverts = [[NSMutableArray alloc] init];
        [currentAdverts addObjectsFromArray:[_fullTableData objectAtIndex:j]];
        count = [currentAdverts count];

        int currentRowsInSection = [self.propertiesTable numberOfRowsInSection:j];

        if(currentRowsInSection > 0) {
            //if any data in current tableView, lets get rid of them first
            for (int i = [self.propertiesTable numberOfRowsInSection:j] - 1; i >=0 ; i--)
            {
                [deleteIndexPaths addObject:[NSIndexPath indexPathForRow:i inSection:j]];
            }
        }
        for (NSUInteger item = 0; item < count; item++) {            
            [insertIndexPaths addObject:[NSIndexPath indexPathForRow:item inSection:j]];
        }
    }


    [self.propertiesTable beginUpdates];

    //we delete old rows - whether we need them or not
    [self.propertiesTable deleteRowsAtIndexPaths:deleteIndexPaths
                                withRowAnimation:UITableViewRowAnimationFade];
    if([self.propertiesTable numberOfSections]) {

        //if any sections, we remove them
        NSIndexSet *nsIndexSetToDelete = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0,[self.propertiesTable numberOfSections])];
        [self.propertiesTable deleteSections:nsIndexSetToDelete withRowAnimation:UITableViewRowAnimationAutomatic];
    }


    //here we have to set new sections, whether they have changed or not
    NSIndexSet *nsIndexSetToInsert = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0,sectionsCount)];
    [self.propertiesTable insertSections:nsIndexSetToInsert withRowAnimation:UITableViewRowAnimationAutomatic];

    //finally we insert rows 
    [self.propertiesTable insertRowsAtIndexPaths:insertIndexPaths
                                withRowAnimation:UITableViewRowAnimationFade];
    [self.propertiesTable endUpdates];

    //now we see the change in UI
    [self.propertiesTable reloadData];
}


0 commentaires