2009-10-22 10 views
5

Po analizie danych JSON w klasie Data, ustawiam właściwość NSArray * nagłówków UIViewController w metodzie fillArrays tej samej klasy Data. W metodzie viewDidAppear mojego kontrolera UIViewController wywołuję reloadData na moim UITableView. numberOfSectionsInTableView uruchamia i zwraca 1, a następnie numberOfRowsInSection odpala i zwraca tablicę 4 (dla 4 ciągów w tablicy). Jednak kontrola nigdy nie trafia do cellForRowAtIndexPath i najtrudniej jest mi zrozumieć dlaczego, zwłaszcza, że ​​mam prawidłowe sekcje i wiersze. Wszystkie komórki są widoczne.cellForRowAtIndexPath nie wywołane; sekcje zwraca 1, a wiersze zwraca 4

Dodałem protokoły UITableViewDataSource i UITableViewDelegate do interfejsu UIViewController i ustawę delegata UITableView i źródło danych na siebie w viewDidLoad (co również jest weryfikowane przez wywoływanie metod wiersza i sekcji liczenia).

Zastanawiam się, czy ma coś ze mną reinicjować UIViewController w Data.m, aby ustawić jego właściwości.

W Data.m:

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

W 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; 
} 
+0

użytkownik może chcieć opublikować kod – coneybeare

Odpowiedz

4

W fillArrays utworzysz inny kontroler widoku - ale nigdy nie zrobisz nic z nim ani jego widokiem, nigdy nie zobaczysz tego widoku. Nigdy nie wywołasz ręcznie viewDidAppear ręcznie, co dzieje się automatycznie, gdy wyświetlany jest widok kontrolerów widoku (TYLKO w kontekście kontrolera nawigacyjnego).

Zwykle przepływ polega na utworzeniu kontrolera widoku i dodaniu tego widoku jako podglądu bieżącego widoku lub naciśnięciu go jako nowego okna za pomocą kontrolera nawigacyjnego. Jestem pewien, że twoim problemem jest to, że tabela nigdy nie jest dodawana do widoku, który faktycznie widzi, więc tabela wywołuje inne metody, ale nigdy nie wywołuje cellForRow, ponieważ jego kod layoutSubviews po prostu nie jest wywoływany.

+0

To było dokładnie to. Tworzyłem kopię kontrolera UIViewController. Jedyne, co musiałem zrobić, to przekazanie referencji do mojego istniejącego do klasy danych poprzez parametr metody. Dziękuję wszystkim za pomoc w moim pierwszym wydaniu tutaj. – azdev

0

Sprawdź, aby upewnić się, że delegat tableView i źródła danych są skierowane do viewController

0

nie widzę Coś nie tak z kodem, jak jest, czy zweryfikowaliście z punktami przerwania, że ​​cellForRow nigdy nie został osiągnięty (mimo że widzę, że posiadacie wyciąg z dziennika)?

Również chciałbym spróbować, aby sprawdzić poprawność, aby zwrócić "1" jawnie w rowsInSection i kodować ciąg znaków w komórce, którą wracasz w cellForRow.

Jeśli wszystko inne zawiedzie, utwórz nowy kontroler widoku tabeli z szablonów XCode i umieść tam swoje połączenia - a następnie, gdy to zadziała, pracuj wstecz, dlaczego Twój kod nie działa.

Również dobrze byłoby zobaczyć kod konfiguracji viewDidLoad (dodaj do odpowiedzi powyżej).

0

jeśli ustawiasz delegata i źródło danych w viewDidLoad, może to być źródłem Twojego błędu. Czy możesz ustawić źródło danych i delegować w init?

+0

Po przeniesieniu kodu UITableView z viewDidLoad do init nie wywołano niestety numberOfSectionsInTableView. – azdev

0

Nie jestem pewien, czy dodajesz swój UITableView jako podgląd do UIViewController.view. Takie było moje podejście.

W tym podejściu znalazłem wykonanie nie dostać się do cellForRowAtIndexPath, dopóki nie wysłałem UIViewController.view do tyłu po dodaniu UITableView jako subview.

Dotarcie tak daleko było tylko częścią problemu.W tym momencie wydawało się, że moje inne kontrolery widoku nie reagują już na zdarzenia dotykowe. Zauważyłem, że gdy dodam również UITableView jako wyeksportowane do rootViewController, wszystkie moje widoki otrzymały odpowiednie zdarzenia dotykowe.

4

Czy dodałeś swój numer tableView do widoku UIViewController?

Zdarzyło mi się, a kiedy dodałem tego

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

następnie cellForRowAtIndexPath rozpoczął pracę.

+0

Ładne i proste. Myślę, że właśnie na tym polega Kendall, ale to miało dla mnie sens. Dzięki! –

4

Przez wzgląd na Google:

Jeśli tableView:numberOfRowsInSection zwraca zero jakiegokolwiek powodu tableView:cellForRowAtIndexPath nie będzie sprawdzony, ponieważ nie istnieją żadne wiersze do nazywają go.

+0

Dla innych osób mieszkających w domu, PROSZĘ upewnić się, że logika logiczna jest poprawna w 'numberOfRowsInSection'. Jestem doświadczonym programistą iOS i właśnie spędziłem ostatnią godzinę próbując dowiedzieć się, dlaczego moje komórki nie wyświetlały się: okazało się, że moje "inne" warunki na końcu długiego sprawdzania przez sekcje ustawiały się ** rows = 0 **. WOOF! – kyleturner

0

Dziękuję bardzo pxl. Kiedy przenieść inicjalizacji UITableView z viewDidLoad do:

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

działa idealnie, gdy kiedykolwiek robię usunąć lub zaktualizować niektóre wiersze UITableView dostaje reloded do mojego UIView.

Powiązane problemy