2009-10-22 40 views
5

Sau khi phân tích dữ liệu JSON trong một lớp dữ liệu, tôi đặt thuộc tính tiêu đề NSArray * của UIViewController trong một phương thức fillArrays của cùng một lớp dữ liệu. Trong phương thức viewDidAppear của UIViewController, tôi gọi reloadData trên UITableView của mình. numberOfSectionsInTableView kích hoạt và trả về 1, sau đó numberOfRowsInSection kích hoạt và trả về một mảng đếm 4 (cho 4 chuỗi trong mảng). Tuy nhiên, kiểm soát không bao giờ được để cellForRowAtIndexPath và tôi đang có thời gian khó hiểu nhất lý do tại sao, đặc biệt là kể từ khi tôi có phần hợp lệ và hàng. Tất cả các ô đều hiển thị.cellForRowAtIndexPath không được gọi; các phần trả về 1 và các hàng trả về 4

Tôi đã thêm giao thức UITableViewDataSource và UITableViewDelegate vào giao diện UIViewController và đặt đại biểu và dữ liệu của UITableView thành self trong viewDidLoad (cũng được xác minh bằng phương thức đếm hàng và phần được gọi).

Tôi tự hỏi nếu nó có một cái gì đó để với tôi reinitializing UIViewController trong Data.m để thiết lập các thuộc tính của nó.

Trong Data.m:

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

Trong 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

bạn có thể muốn đăng một số mã – coneybeare

Trả lời

4

Trong fillArrays, bạn tạo một bộ điều khiển khung nhìn khác - nhưng bạn không bao giờ làm bất cứ điều gì với nó hoặc khung nhìn của nó, bạn sẽ không bao giờ nhìn thấy khung nhìn đó. Bạn sẽ không bao giờ gọi viewDidAppear theo cách thủ công, điều đó xảy ra tự động khi khung nhìn bộ điều khiển xem được hiển thị (CHỈ trong ngữ cảnh của bộ điều khiển chuyển hướng).

Thông thường luồng là, bạn tạo bộ điều khiển chế độ xem và thêm chế độ xem đó dưới dạng chế độ xem phụ của chế độ xem hiện tại hoặc đẩy nó dưới dạng cửa sổ mới thông qua bộ điều khiển điều hướng. Tôi chắc chắn rằng toàn bộ vấn đề của bạn là chúng không bao giờ được thêm vào một khung nhìn mà bất kỳ ai thực sự thấy, vì vậy bảng gọi các phương thức khác nhưng không bao giờ gọi cellForRow vì mã layoutSubviews của nó đơn giản là không được gọi.

+0

Đó là chính xác nó. Tôi đã tạo một bản sao của UIViewController. Tất cả những gì tôi phải làm là chuyển tham chiếu đến lớp hiện có của tôi đến lớp Data thông qua một tham số phương thức. Cảm ơn tất cả sự giúp đỡ của bạn với vấn đề đầu tiên của tôi ở đây. – azdev

0

Kiểm tra để đảm bảo rằng các đại biểu tableView và dataSource được trỏ đến viewController

0

Tôi không thể nhìn thấy bất cứ điều gì sai với mã như-là, có bạn xác minh với breakpoints rằng cellForRow là không bao giờ đạt được (mặc dù tôi thấy bạn có một tuyên bố đăng nhập)?

Ngoài ra, tôi sẽ thử chỉ để kiểm tra tính chính xác để trả về "1" một cách rõ ràng trong rowsInSection và mã hóa một chuỗi trong ô bạn đang quay lại trong cellForRow.

Nếu vẫn thất bại, hãy tạo bộ điều khiển xem bảng mới từ các mẫu XCode và đặt các cuộc gọi của bạn vào đó - sau đó khi hoạt động, hãy làm việc ngược về lý do mã của bạn không hoạt động.

Ngoài ra, bạn nên xem mã thiết lập viewDidLoad của mình (thêm vào câu trả lời ở trên).

0

nếu bạn đang đặt đại biểu và nguồn dữ liệu tại viewDidLoad, thì đó có thể là nguồn gốc của lỗi của bạn. Bạn có thể đặt nguồn dữ liệu và ủy nhiệm trong init không?

+0

Khi tôi chuyển mã UITableView từ viewDidLoad sang init, thậm chí không phải numberOfSectionsInTableView được gọi là, không may. – azdev

0

Tôi không chắc chắn rằng bạn thêm UITableView của bạn dưới dạng subview vào UIViewController.view. Đây là cách tiếp cận của tôi.

Trong cách tiếp cận này, tôi thấy việc thực hiện đã không nhận được vào cellForRowAtIndexPath cho đến khi tôi gửi UIViewController.view về phía sau sau khi thêm UITableView làm chế độ xem con.

Việc này chỉ là một phần của sự cố.Tại thời điểm này, có vẻ như các bộ điều khiển chế độ xem khác của tôi không còn phản hồi các sự kiện chạm. Tôi thấy rằng khi tôi cũng thêm UITableView như một subview vào rootViewController, tất cả các khung nhìn của tôi đều có các sự kiện touch thích hợp.

4

Bạn đã thêm tableView vào chế độ xem UIViewController chưa?

Nó xảy ra với tôi, và khi tôi thêm này

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

sau đó cellForRowAtIndexPath bắt đầu làm việc.

+0

Đẹp và đơn giản. Tôi nghĩ rằng đây là những gì Kendall đang nhận được ở trên, nhưng điều này có ý nghĩa với tôi ngay lập tức. Cảm ơn! –

4

Vì của Google:

Nếu tableView:numberOfRowsInSection lợi nhuận bằng không vì lý do gì tableView:cellForRowAtIndexPath sẽ không được gọi vì không có hàng để gọi nó cho.

+0

Đối với những người khác theo dõi ở nhà, XIN chắc chắn rằng bạn đảm bảo logic boolean của bạn là chính xác trong 'numberOfRowsInSection'. Tôi là một nhà phát triển iOS có kinh nghiệm và tôi đã dành một giờ để cố gắng tìm ra lý do tại sao các ô của tôi không hiển thị: biến điều kiện 'else' của tôi ở phần cuối của các phần kiểm tra dài được thiết lập ** rows = 0 **. WOOF! – kyleturner

0

Cảm ơn bạn rất nhiều pxl. Khi tôi di chuyển khởi UITableView từ viewDidLoad để:

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

nó hoạt động một cách hoàn hảo khi bao giờ tôi làm xóa hoặc cập nhật một số hàng UITableView được reloded để UIView của tôi.

Các vấn đề liên quan