2010-03-30 20 views
17

Bất cứ ai có thể cho tôi biết làm cách nào để có thể nhận được một IndexPath ô? Tôi đã lưu IndexPath trong bảngView: cellForRowAtIndexPath: phương thức nhưng điều này chỉ tải khi ô được xem và tôi cần biết đường dẫn chỉ mục của nó trên phương thức viewDidLoad. điều này dẫn đến một giá trị null vì như tôi đã nói nó chỉ tải giá trị của nó sau khi ô được xem một lần.Chỉ số di động UITableViewPath

Cảm ơn bạn.

EDIT

Mục đích là có thể chuyển đến một ô cụ thể có số cụ thể nhưng không tuyến tính với các phần và số hàng.

+1

tại sao bạn cần indexPath trong phương pháp viewDidLoad? –

+0

bởi vì tôi cần phải nhảy đến một vị trí tế bào cụ thể trên bàn của tôi, rằng tôi không biết ở vị trí nào nó sẽ được. –

+0

Tôi đang bối rối.Các phần và hàng đếm cho một phần tử dữ liệu cụ thể trong bảng không tuyến tính như thế nào? Nếu nó không tuyến tính, một bảng tuyến tính sẽ được hiển thị như thế nào? – Giao

Trả lời

18

Sử dụng phương pháp indexPathForCell: trên bảngXem, được cung cấp con trỏ đến UITableViewCell nó trả về chỉ mục của nó.

Bạn có thể đặt scrollToRowAtIndexPath:atScrollPosition:animated: trong phương thức viewWillAppear nếu chưa được thiết lập trong viewDidLoad. Đây là một nơi tốt hơn anyway nếu xem có thể xuất hiện nhiều hơn một lần sau khi được tải, chẳng hạn như khi một bộ điều khiển xem phương thức nó gọi từ chức.

+1

Vấn đề là các tế bào có thể tái sử dụng và nó không thể nhìn thấy hoặc instanced trước khi tableView: cellForRowAtIndexPath: được gọi là vì vậy tôi không có bất kỳ tham chiếu đến các tế bào. Vì tôi đang gọi hàng số 0 từ phần 5, tôi đang tạo IndexPath và sử dụng nó trong scrollToRowAtIndexPath: atScrollPosition: animated: Tôi bị mắc kẹt với giải pháp xấu xí này, vì vậy nếu bạn có ý tưởng tốt hơn hãy chia sẻ nó. –

+1

Vâng, nếu bạn không biết bạn muốn di chuyển ô nào và không biết đường dẫn chỉ mục (hàng/phần) nào bạn muốn cuộn đến, có vẻ như bạn không thể làm được. Điều này có thể không áp dụng, nhưng trong trường hợp của tôi, tôi có tất cả các ô trong một NSArray, vì vậy tôi có thể cuộn đến bất kỳ ô nào, nhưng sau đó tôi không sử dụng lại bất kỳ ô nào. – progrmr

+0

Cảm ơn tất cả sự kiên nhẫn của bạn –

2

A UITableViewCell không có thuộc tính NSIndexPath. Đại biểu UITableViewDataSource xác định các phương thức yêu cầu một ô cho một số NSIndexPath nhất định, nhưng điều đó không có nghĩa là ô có bất kỳ mối quan hệ lâu dài nào với thuộc tính NSIndexPath.

Có thể nó sẽ giúp ích nếu bạn giải thích thêm về những gì bạn muốn tài sản này? Bạn muốn làm gì với vị trí của ô trong viewDidLoad?

+0

Tôi muốn có thể chuyển đến ô cụ thể đó bằng scrollToRowAtIndexPath: atScrollPosition: hoạt ảnh: tại dường như là cách chính xác để thực hiện. –

+0

Ok, sau đó tạo biến 'NSIndexPath' và tạo bản sao cho việc sử dụng của bạn để bạn có thể gọi phương thức đó trong tương lai. – pkananen

+0

Đó là những gì tôi có. Vấn đề là biến chỉ được instanced khi cell được xây dựng và nếu ô không hiển thị trong đầu nó không được xây dựng và giá trị này là null –

0

Dường như với tôi như bạn đã trả lời câu hỏi của riêng bạn: bạn không thể. Bởi vì ô không có indexPath khi viewDidLoad được thực hiện. Và trên thực tế, nó không có sau này, bởi vì cùng một tế bào có thể được tái sử dụng để được ở một chỉ số khác trong vòng một phần mười giây, nếu bạn sử dụng tế bào dequeueing (từ tốt đẹp!), Mà bạn nên.

EDIT: Ok tôi nghĩ rằng tôi thấy những gì bạn muốn: bạn đang lưu indexPath mình ở đâu đó khi bạn đưa ô đó vào bảngView. Lưu ý: nếu bạn không làm điều này, không có cách nào mà bạn có thể thực sự biết tại đó indexPath một ô cụ thể được đặt, ít nhất là không nếu bạn đang làm những việc theo cách bạn nên. Vì vậy, những gì bạn có thể làm chỉ đơn giản là tạo tất cả các ô trong phương thức viewDidLoad của bạn, lưu chúng trong một mảng, và sau đó, khi xem bảng yêu cầu chúng, chỉ cần đưa chúng ra khỏi mảng đó.

Lưu ý rằng đây không phải là cách tốt để điền vào chế độ xem bảng vì nó ngăn không cho tái sử dụng các ô. Một cách tốt hơn là lưu các nội dung của các ô (đồng bằng UIViews) vào mảng và thêm chúng dưới dạng trẻ em vào chế độ xem nội dung của ô trước khi trả lại ô. Điều này sẽ cho phép tái sử dụng tế bào, điều này rất quan trọng cho hiệu suất tốt. Nếu bạn không có nhiều ô hơn là vừa với màn hình, bạn không phải lo lắng về việc sử dụng lại chúng.

+0

Một phần câu trả lời của bạn không đúng. Vào một thời điểm sau khi tôi lưu trữ IndexPath của một ô cụ thể, tôi vẫn có thể sử dụng nó IndexPath vì nó được tham chiếu ở một nơi khác. –

+0

@Reonarudo: Xem chỉnh sửa. – Felixyz

+0

Ok, có thể bạn không quen với những gì đang xảy ra. Khi tôi lưu trữ một IndexPath ô, nó sẽ luôn luôn có cùng giá trị ngay cả khi ô được instanced hay không. Nó được tính toán với số hàng cho mỗi phần và số phần os được cung cấp cho tôi bởi e tableView: cellForRowAtIndexPath: và khi tôi tìm thấy các ô cụ thể tôi muốn tôi chỉ lưu trữ vị trí của chúng, tôi không có ý định lưu trữ tất cả các tế bào bởi vì họ là cách để many.Maybe cách tiếp cận tốt nhất sẽ được di chuyển tất cả xuống tiết kiệm tất cả các IP sau đó tất cả lên trên viewDidLoad? Bạn nghĩ sao. Cảm ơn bạn. –

1

Hãy thử này ..

NSSet *touches = [event allTouches]; 
UITouch *touch = [touches anyObject]; 
CGPoint currentTouchPosition = [touch locationInView:EventlistTable_obj]; 
NSIndexPath *indexPath = [EventlistTable_obj indexPathForRowAtPoint: currentTouchPosition]; 
NSLog(@"Selected row:%d in section:%d",indexPath.row,indexPath.section); 

Đừng gọi như thế này:

[cell.fourth_image_button addTarget:self action:@selector(Btn_pressed:event:) forControlEvents:UIControlEventTouchUpInside]; 
Các vấn đề liên quan