2009-07-15 15 views
4

Ich habe ein NSURL-Objekt, das Daten von meiner Site basierend auf einer vom Benutzer in die Suchleiste eingegebenen Variable abruft.Inhalt von UITableView dynamisch ändern

Ich teile diese Daten in ein NSArray.

Sobald ich das getan habe, möchte ich die Daten in einem UITableView anzeigen.

Meine Frage ist dies. Ist es möglich, die Daten dynamisch in eine UITableView zu laden?

d. H. Programm lädt, keine Daten, so dass UITableView leer ist, dann sucht der Benutzer nach einer Variablen. Ruft einige Daten ab und der Inhalt wird in das UITableView geladen. Sucht nach einer neuen Variablen, alte Daten werden von UITableView gelöscht und die neuen Daten hinzugefügt?

Ich versuche derzeit, dies mit Interface Builder zu tun, aber befürchte, dass ich meine Schnittstelle pragmatisch machen muss, damit ich das UITableView zerstören und neu erstellen kann, aber ich bin mir nicht sicher.

Danke für jede Hilfe.

Antwort

7

sicher die Methode reload auf UITableView den Trick

+0

Möchten Sie eine Klarstellung zu meinem ursprünglichen Beitrag hinzuzufügen, warum ich nicht glaube, ich reload verwenden können. – JonB

+0

Auf weitere Inspektion, und ein Tutorial zu finden, was ich tun möchte, werde ich sehr dumm aussehen, wenn ich versuche, reloadData nicht zu verwenden. Sorry für die verschwenderische Frage. – JonB

3

Angst nicht, ist Subklassen UITableView sehr einfach. In xCode wählen Sie einfach eine neue Datei, wählen "Cocoa Touch Classes", "Objective-c class" und im Dropdown-Menü "Subclass of" wählen Sie "UITableView". xCode fügt eine UITableViewController-Unterklasse mit Stubs zum Erstellen hinzu.

Ich füllte ein sehr einfaches Beispiel, das die Tabellendaten aus einem Array zeichnet und vom Anwendungsdelegaten angezeigt wird. Wie Sie vorgeschlagen haben, sendet eine reloadData Nachricht an die UITableView die angezeigten Daten.

Wie Sie wahrscheinlich herausgefunden haben, ist die Verwendung von InterfaceBuilder für diesen Job viel schwieriger als programmatisch.

Cheers, niels

// 
// 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

Es ist ein bisschen kompliziert, aber meine Lösung, die sehr zuverlässig arbeitet folgt: (vorausgesetzt, dass Sie ein Array als Bündel von Arrays, die jeweils einen Abschnitt darstellt, und enthält Elemente, die in der Tat Zeilen in der Tabelle sind).

Dieses Beispiel passt zu der Situation, wenn wir einige Daten vom Server (z. B. JSON) laden, und das Ergebnis kann in der Anzahl der Abschnitte und/oder Reihen sehr unterschiedlich sein.

Leere Funktion können Sie weglassen

-(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]; 
} 
Verwandte Themen