2009-12-21 35 views
6

Tôi khá mới phát triển Iphone. vì vậy hãy chịu tôi nếu tôi hỏi một số câu hỏi rất đơn giản.UITableView cellforrowatindexpath không được gọi là

Trong ứng dụng của tôi, tôi có nhiều chế độ xem (nghĩa là các tệp .xib). Khi nhấp vào nút trên giao diện chính (CouponWebsiteViewController.Xib) ứng dụng sẽ tải chế độ xem thứ hai (BrowseList.Xib) chứa một UITable và tôi phải điền UITable đó với một số dữ liệu. Tôi đã viết mã sau đây để điền vào dữ liệu trong hồ sơ BrowseList.m:

- (void) viewDidLoad{ 
    arrayData = [[NSArray alloc] init]; 
    arrayData = [arrayData arrayByAddingObject:@"dfsgdf"]; 
    arrayData = [arrayData arrayByAddingObject:@"aaaaaa"]; 
    self.lblNewScreen.text = [arrayData objectAtIndex:0]; 
    [super viewDidLoad]; 
} 

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

// Customize the number of rows in the table view. 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [arrayData count]; 
} 

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] 
       initWithStyle:UITableViewCellStyleDefault 
       reuseIdentifier:CellIdentifier] 
       autorelease]; 
    } 

    NSString *cellValue = [arrayData objectAtIndex:indexPath.row]; 
    cell.textLabel.text = cellValue; 
    [tableView setEditing:YES animated:YES]; 
    return cell; 
} 

Nhưng Nó không được đưa dữ liệu trong bảng, khi tôi gỡ lỗi mã này tôi thấy rằng nó không được thực hiện phương pháp cellForRowAtIndexPath nhưng nó được gỡ rối numberOfRowsInSection và numberOfSectionsInTableXem các phương thức.

Nhưng điều thú vị là khi tôi viết cùng một mã trên CouponWebsiteViewController.m (tức là trên màn hình chính) thì nó đang điền dữ liệu vào bảng.

Vấn đề là mã này hoạt động tốt trên chế độ xem chính nhưng mã này không hoạt động cho các chế độ xem khác.

Bất kỳ ai có thể cho tôi biết tôi đang thiếu hoặc cách nào khác để điền UITable trên các chế độ xem khác với chế độ xem chính.

Cảm ơn trước. Gaurav

Trả lời

9

Tôi không tích cực nhưng dưới đây là một số ý tưởng.

  • Tôi nghĩ khi bạn đặt mã mảng đó vào viewDidLoad thì đã quá muộn. ViewDidLoad được thực hiện sau khi dữ liệu đã được đặt trong bảng. Hãy thử đặt mã này trong phương thức initWithStyle hoặc bất kỳ phương thức nào init mà bạn có. Hoặc bạn thậm chí có thể đặt nó vào phương pháp ViewWillAppear, nhưng sau đó hãy chắc chắn để làm theo đề nghị tiếp theo này.
  • Điều khác bạn có thể thử là, chỉ cần gọi [self.tableView reloadData] ở cuối phương thức viewDidLoad. Mặc dù điều đó không lý tưởng như gợi ý đầu tiên.
+1

Thêm ** [self.tableView reloadData] ** vào trình phân tích cú pháp ** - (void)DidEndDocument: (NSXMLParser *) ** làm việc tốt cho tôi khi tôi gặp vấn đề tương tự. Cần nhớ NSXMLParser là một hoạt động SAX. – subv3rsion

3

Initialize UITableView trong viewWillAppear ...

5

Bạn có chắc bạn thiết lập lớp học của bạn như các nguồn dữ liệu trên bảng? Để thực hiện việc này, hãy điều khiển + nhấp vào chế độ xem bảng trong Trình tạo giao diện và kéo nó vào Chủ sở hữu của tệp trong Trình giữ chỗ. Sau đó chọn dataSource (và có thể ủy nhiệm quá, tùy thuộc vào thiết lập xem bộ điều khiển của bạn).

0

Bạn có chắc chắn đặt chế độ xem bảng làm đại biểu không?

Nếu bạn có một UITableViewController, bạn cần này trong viewDidLoad:

[self.tableView setDelegate:self]; 

Nếu bạn có một loại quan điểm điều khiển, chỉ cần thực hiện UITableView một IBOutlet, làm cho các kết nối cho chủ sở hữu tập tin cho tableViewDelegate và tableViewDataSource sau đó thực hiện việc này trong viewDidLoad:

[self.myTableProperty setDelegate:self]; 

Cũng đảm bảo tuân thủ các giao thức UITableViewDelegate và UITableViewDataSource trong của bạn.h tập tin nếu View Controller không phải là một UITableViewController

Cheers

0

Nếu mảng có thể thay đổi hoặc mảng bạn đang sử dụng để cư trú các nội dung của các tế bào được thiết lập như một tài sản trong tập tin tiêu đề của bạn. sau đó hãy chắc chắn rằng bạn luôn luôn sử dụng

self.yourArray = [[NSMutableArray alloc] init]; 
[self.yourArray addObject:@"Object1"]; 

và sau đó để lấy số liệu trong numberOfRowsInSection cũng bạn cần phải truy cập vào nó như:

return [self.yourArray count]; 

này là khá giống như con trỏ này bạn sử dụng để tham khảo cho các biến mẫu của bạn. Và dĩ nhiên bạn cũng cần lưu ý nếu bạn đã đặt dataSource và ủy quyền của UITableView cho chủ sở hữu của tệp. Ngoài ra, bạn đã bao gồm UITableViewDelegate và UITableViewDataSource trong tệp tiêu đề của viewController.

Tôi hy vọng nó sẽ giúp bạn. May mắn nhất. Happy Coding! Chúc mừng !!

1

Tôi đã gặp phải một số vấn đề tương tự ở đó. Bảng phân quyền xem và nguồn dữ liệu được đặt đúng, và (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section cũng trả về số dương. Nhưng - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath không bao giờ được gọi.

Tôi đã thử các phương pháp trước đây, nhưng nó không hoạt động. Cuối cùng, tôi đã nhận thấy rằng tôi đã quên để thêm xem bảng như một subview của bộ điều khiển xem của tôi. Sau khi làm điều đó, nó hoạt động như một sự quyến rũ.

4

Tôi đề nghị bạn đảm bảo rằng kích thước của bảng yêu cầu các hàng sẽ được hiển thị.

Thật vậy, có thể là trường hợp tại sao phương thức cellForRowAtIndexPath không được gọi, tuy nhiên, nên gọi số numberOfRowsInSection.

Trong trường hợp này, bạn sẽ không thấy gì trong bảng của mình.

2

Câu hỏi cũ, nhưng tôi sẽ kêu vang. Đối với những người khác.

Có một số lý do khiến bảng nhìn không cập nhật và cellForRowAtIndexPath: không được gọi.

Nếu bạn đang sử dụng một UITableViewController trực tiếp sau đó nó amy được rằng "numberOfRowsInSection:" phương pháp được trở về 0

Nếu bạn đang sử dụng một UITableView trong điều khiển điểm của bạn. rất có thể là bạn chưa chấp nhận các giao thức chính xác và đã triển khai đúng phương thức - cộng với nếu bạn đang sử dụng một xib hoặc bảng phân cảnh mà bạn chưa gán đúng đại biểu và nguồn dữ liệu là vấn đề tiềm ẩn khác.

Cuối cùng nếu bạn đang sử dụng một lớp con của UITableViewController sau đó nó có thể là bạn chưa ghi đè một trong những phương pháp mặc định và một lần nữa numberOfRowsInSection đang trở lại 0.

3

Đối với bất cứ ai mà đi qua vấn đề này, tôi giải quyết này bằng cách thêm bộ điều khiển TableView tôi như một đứa trẻ với bộ điều khiển cha mẹ sử dụng:

UITableViewController * table = [[UITableViewController alloc] init]; 
... 
[self.view addSubview:table.tableView]; 
[self addChildViewController:table]; 
+0

Tại sao tính năng này hoạt động? Có lời giải thích nào cho điều đó không? – heiko

-1

tôi cũng đã có rằng vấn đề trên UITableView, tôi cũng thiết lập các nguồn dữ liệu và uỷ thác cho xem bảng nhưng phương pháp cellForRowAtIndexPath của tôi đã không được gọi.

Giải pháp:

  • mạng của tôi bị chặn phương pháp của tôi (bằng cách sử dụng tường lửa). Tôi đã hỏi quản trị viên mạng của mình và tôi đã được cấp quyền truy cập đầy đủ vào mạng và sau đó phương thức cellForRowIndexPath của tôi đã được gọi.

  • khi trả lời của tôi đến từ một dịch vụ web, do phản hồi chặn mạng là màu đen nên phương thức cellForRowIndexPath không được gọi.

0

Vâng, tôi có thể thêm một điểm đơn giản cho mọi người có vấn đề này. Tôi sẽ khuyên bạn sử dụng debug và đảm bảo rằng:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

không trả lại 0. Nếu chức năng này không được thực hiện hoặc nếu nó trả về 0, phương pháp này:

cellForRowAtIndexPath:(NSIndexPath *)indexPath 

không được gọi ở tất cả các từ không có ô nào được hiển thị.

0

Kiểm tra xem chế độ xem bảng đã được thêm vào chế độ xem chưa. Nếu không thì các phương thức phân bổ và xem nguồn dữ liệu bảng khác sẽ được kích hoạt nhưng không phải là ô khai hoang :)

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