2011-06-26 35 views
8

Làm cách nào để lấy ô cho một tệp indexPath hiện không hiển thị trong bảng? (Tế bào là ra khỏi phạm vi)iOS SDK: Cách nhận ô trong chế độ xem bảng không hiển thị?

Mã để nhận di động của tôi:

NSString *name = [[(ELCTextfieldCell *)[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]] rightTextField] text]; 

-cellForRowAtIndexPath... lợi nhuận nil vì các tế bào tại indexPath yêu cầu là ra khỏi phạm vi. Vì vậy, làm thế nào để tôi nhận được các tế bào chính xác và không nil?

+0

Vui lòng cung cấp thêm thông tin và mã. – dasdom

+0

OK, tôi có chế độ xem bảng được nhóm, trong đó một số ô có trường văn bản và ở cuối có các ô đại diện cho các nút. Bây giờ tôi có vấn đề là nếu tôi ở cuối bảng, vài ô đầu tiên của tôi hiện nằm ngoài phạm vi nhưng nếu tôi bấm vào một ô đại diện cho một nút, tôi cần thông tin được cung cấp ngay từ đầu. Bây giờ tôi đã thử: [[(ELCTextfieldCell *) [tableView cellForRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: 0]] rightTextField] văn bản] nhưng -cellForRowAtIndexPath: ... trả về nil vì ô nằm ngoài phạm vi. Vì vậy, làm thế nào để có được ô đúng (và không phải là nil)? –

+0

Câu trả lời cho câu hỏi của bạn là nacho4d nói - không sử dụng các ô để lấy thông tin, lấy nó từ nguồn dữ liệu cơ bản của bạn. Câu trả lời rộng hơn là bạn dường như đang sử dụng chế độ xem bảng để đặt ra một giao diện người dùng cuộn thay vì sử dụng chế độ xem trong trình cuộn. – Abizern

Trả lời

4

Đây không phải là cách hoạt động. Bạn cần lấy và lưu trữ thông tin ngay khi nó được nhập hoặc thay đổi. Nó có thể dễ dàng thoát khỏi phạm vi và bạn không thể đảm bảo cuộc sống của bạn đủ lâu. Vâng, về mặt kỹ thuật, bạn có thể giữ nó (và luôn luôn trả về cùng một ô cho cùng một đường dẫn chỉ mục), nhưng tôi muốn đặt câu hỏi về thiết kế đó.

+0

OK, nhưng tôi có một bảng nơi các ô có thể được thêm động và tôi không biết có bao nhiêu ô mà người dùng sẽ tạo ra. –

+0

Tôi nghĩ cách tiếp cận hợp lý duy nhất là lưu các thay đổi ngay khi chúng xảy ra. Bạn có thể có một thời gian khó lấy dữ liệu đó sau đó, và các tế bào thậm chí có thể đã "chết" và giải phóng. – Eiko

15

Chỉ UITableView giữ các ô hiển thị. Nếu bạn cần một thiết bị không hiển thị, bạn phải gọi số tableView:cellForRowAtIndexPath: của số UITableViewdataSource. Vì vậy, nếu tự là một lớp học đó là dataSource:

UITableViewCell * cell = [self tableView:table cellForRowAtIndexPath:indexPath]; 
+0

thx, nó hoạt động! : D –

+2

Nói chung sẽ không bảo toàn dữ liệu được nhập vào các ô đó. Chỉ hoạt động nếu vẫn còn trong bộ nhớ cache. – Eiko

+0

nó hoạt động ... !!! cảm ơn rất nhiều.bạn đã tiết kiệm rất nhiều giờ của tôi. –

2

UITableViewCells được thực hiện để được tái sử dụng/tái chế theo một cách mà người dùng sẽ không cần phải tạo ra các tế bào nhiều hơn số lượng của những người nhìn thấy được. Bạn thường không cần truy cập vào một ô không hiển thị. Nó sẽ là đủ bạn truy cập nguồn dữ liệu của bạn và nhận/thiết lập các dữ liệu phóng viên ở đó. Các ô để hiển thị một số trạng thái của nguồn dữ liệu. Không phải là nguồn dữ liệu riêng của mình :)

Edit:

Bạn nói rằng bạn cần một số thông tin (văn bản) từ một tế bào trên, phải không? Nếu bạn sử dụng phương pháp cellForRowAtIndexPath:, ô sẽ được tạo lại nhưng bạn có thể không nhận được văn bản nằm trong trường văn bản. Nguyên nhân? bởi vì có lẽ bạn đã không lưu nó ở một nơi khác. Nếu bạn đã lưu nó, sau đó truy cập trực tiếp thay vì đi qua các tế bào.

0

Thông tin có điền vào bảng của bạn từ một mảng không? Bạn có thể không kéo trực tiếp ra khỏi mảng tại 0 chỉ mục, giống như cellForRowAtIndexPath của bạn có lẽ sẽ lấy và điền vào ô đó khi nó được hiển thị?

+0

Không, nhưng tôi đã giải quyết nó! :) –

0

Trong tiếp tục @ câu trả lời của Raphael, đây là (làm việc) nhanh chóng 3 giải pháp:

UITableViewCell cell = self.tableView(self.tableView, cellForRowAt: indexPath)

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