Frage

Nach dem JSON-Daten in einem Datenklasse Parsen, stelle ich die NSArray * Schlagzeilen Unterkunft UIViewController in einem fillArrays Verfahren derselben Datenklasse. Im viewDidAppear Methode meiner UIViewController, nenne ich reload auf meinem UITableView. numberOfSectionsInTableView Feuer und gibt 1, dann numberOfRowsInSection Brände und gibt eine Array Zahl von 4 (für 4 Strings in dem Array). Allerdings erhält die Kontrolle nie cellForRowAtIndexPath und ich die härteste Zeit, die zu verstehen, warum, zumal ich gültige Abschnitte und Zeilen haben. Die Zellen sind sichtbar.

Ich habe die UITableViewDataSource und UITableViewDelegate Protokolle der UIViewController Schnittstelle hinzugefügt und die UITableView Delegierter und Datasource selbst gesetzt in viewDidLoad (die auch von den Zeilen- und Abschnitt Zählung Methoden überprüft wird genannt wird).

Ich frage mich, ob es etwas muss mit mir die UIViewController in Data.m Neuinitialisierung, um seine Eigenschaften zu setzen.

In Data.m:

- (void)fillArrays:(NSArray *)jsonObjs {
    NSLog(@"fillArrays");               
    HeadlinesRootViewController *hrvc = [[HeadlinesRootViewController alloc] init];
    hrvc.headlines = [self getJsonValuesForKey:@"headline" inArrayOfObjects:jsonObjs];
    [hrvc viewDidAppear:NO];
}

In ViewController.m:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad");
    // Table view
    headlineTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 180, self.view.bounds.size.width, 300) style:UITableViewStylePlain];
    [headlineTableView setDelegate:self];
    [headlineTableView setDataSource:self];
    // Temporary
    self.headlines = [[NSMutableArray alloc] initWithObjects:@"headline1", @"headline2", @"headline3", @"headline4", nil];



    [self.view addSubview:headlineTableView];
    self.headlineTableView = headlineTableView;
    [headlineTableView release];
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"viewdidappear");
    NSLog(@"headlines: %@", self.headlines); // Returns an array of 4 headlines
    if( [self.headlines count] != 0 ){
        [self.headlineTableView reloadData];
    }
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    NSLog(@"numberOfSectionsInTableView: 1");
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"numberOfRowsInSection: %d", [self.headlines count]);
    return [self.headlines count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"cellForRowAtIndexPath");
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.text = [[NSString alloc] initWithFormat:@"%@", [self.headlines objectAtIndex:indexPath.row]];

    return cell;
}
War es hilfreich?

Lösung

In fillArrays, Sie einen anderen View-Controller erstellen - aber Sie haben nie etwas mit ihm oder seiner Ansicht nach würden Sie nie diese Ansicht sehen. Sie würden nie manuell entweder viewDidAppear nennen, das automatisch geschieht, wenn eine View-Controller-Ansicht angezeigt wird (nur im Rahmen einer Navigationssteuerung obwohl).

Normalerweise ist der Fluss ist, erstellen Sie einen View-Controller und entweder diese Ansicht als Subview einer aktuellen Ansicht hinzuzufügen, oder es als ein neues Fenster über eine Navigationssteuerung drücken. Ich bin mir ziemlich sicher, dass Ihr ganzes Problem ist, dass sie Tisch nie eine Ansicht jemand tatsächlich sieht hinzugefügt wird, so dass die Tabelle nennt die anderen Methoden, aber nie ruft cellForRow weil sein layoutSubviews Code wird einfach nicht aufgerufen wird.

Andere Tipps

Haben Sie Ihre tableView der Ansicht von UIViewController hinzugefügt?

Es passierte mir, und als ich habe diese

[self.view addSubview:table];
[table release];

dann cellForRowAtIndexPath zu arbeiten begann.

Für Google willen:

Wenn tableView:numberOfRowsInSection kehrt Null aus irgendeinem Grund tableView:cellForRowAtIndexPath wird nicht aufgerufen, da gibt es keine Zeilen nennen es für.

Überprüfen Sie, um sicherzustellen, dass die Tableview Delegierten und Datenquelle der Viewcontroller hingewiesen werden

Ich kann nichts falsch mit dem Code sehen wie sie ist, haben Sie mit Haltepunkten überprüft, dass cellForRow nie erreicht ist (obwohl ich sehen Sie eine Protokollerklärung haben)?

Auch würde ich versuchen, nur für eine Plausibilitätsprüfung „1“ ausdrücklich in rowsInSection zurückzukehren, und codieren eine Zeichenfolge in der Zelle, die Sie in cellForRow zurückkehren.

Wenn alle Stricke reißen, erstellen Sie einen neuen Tabelle View-Controller aus den XCode Vorlagen und Ihre Anrufe setzen dort -. Dann, wenn das funktioniert, arbeitet rückwärts, warum Ihr Code nicht

Auch wäre es gut, Ihren viewDidLoad Setup-Code, um zu sehen (add oben bitte beantworten).

Wenn Sie die Delegaten und Datenquelle bei viewDidLoad sind Einstellung sein, dass kann dann die Quelle des Fehlers. Können Sie die Datenquelle und Delegierter in init gesetzt?

Ich bin nicht sicher, dass Sie Ihre UITableView als Subview UIViewController.view hinzuzufügen. Das war mein Ansatz sowieso.

Bei diesem Ansatz fand ich die Ausführung nicht in cellForRowAtIndexPath bekommen hat, bis ich UIViewController.view auf die Rückseite nach der Zugabe von UITableView als Subview gesendet.

Ankommen war dies bisher nur ein Teil des Problems. Zu diesem Zeitpunkt schien es, dass meine andere Ansicht-Controller nicht mehr reagieren Ereignisse zu berühren. Ich fand, dass, wenn ich auch die UITableView als Subview der RootViewController hinzufügen, werden alle meine Ansichten die entsprechenden Touch-Ereignisse einsehen.

Vielen Dank pxl. Wenn ich die UITableView Initialisierung von viewDidLoad bewegen zu:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil"

es funktioniert perfekt, wenn immer ich einige Zeilen machen löschen oder aktualisieren, die UITableView auf meinen UIView reloded wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top