2013-04-09 23 views
6

trong ứng dụng của tôi Tôi có một UITabeView với UITextField s bên trong mỗi ô. Tuy nhiên, tôi đang gặp khó khăn khi triển khai các nút trước/tiếp theo để làm cho trường văn bản bên trong/UITableViewCell trước đó là tiếp theo.Thực hiện Prev./Các nút tiếp theo trong UITableView để trả lời đầu tiên UITextField trong ô không hiển thị

Tôi đã phân lớp là lớp UITableViewCell để gọi phương thức nhất định là delegate khi nút prev //extext được nhấn và chuyển chính ô đó làm tham số của phương thức này (để tôi có thể lấy đường dẫn chỉ mục của nó) để tính toán mà là con đường chỉ số của tế bào mà trường văn bản đã được thực hiện trả lời đầu tiên)

trong việc thực hiện các phương pháp của đại biểu I:

  • lấy đường dẫn chỉ số của các tế bào nút mà đã ép
  • cộng hoặc trừ 1 từ chỉ mục pa thứ của tế bào đó (tùy thuộc vào nút được nhấn)
  • có được các tế bào mà textfield phải được thực hiện trả lời đầu tiên sử dụng phương pháp -cellForRowAtIndexPath: trên xem bảng
  • làm cho lĩnh vực văn bản đầu tiên trả lời khi

Vấn đề là phương thức -cellForRowAtIndexPath: chỉ trả về ô nếu nó hiển thị. Vì vậy, khi các tế bào là không nhìn thấy nó sẽ trở lại nil và các thuật toán trên sẽ không hoạt động trong khi khi các tế bào trên màn hình nó sẽ hoạt động chính xác.

Đây là mã của tôi cho mục đích trước. nút, với điều kiện MUInfoMateriaTableViewCell là lớp con của tôi về UITableViewCell và rằng nó có một tài sản mà trả lĩnh vực văn bản của nó textField:

- (void)prevButtonPressedInCell:(MUInfoMateriaTableViewCell *)cell 
{ 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
    NSIndexPath *previousIndexPath = [NSIndexPath indexPathForRow:indexPath.row-1 inSection:indexPath.section]; 

    MUInfoMateriaTableViewCell *newCell = (MUInfoMateriaTableViewCell *)[self.tableView cellForRowAtIndexPath:previousIndexPath]; 
    [newCell.textField becomeFirstResponder]; 
} 

Có cách nào để "có được" một tế bào đó không phải là nhìn thấy được vì vậy tôi có thể làm cho văn bản của mình trường trả lời đầu tiên? Hoặc bạn có thể gợi ý cho tôi một thuật toán khác để giải quyết vấn đề này không?

Trả lời

7

Bạn có thể khắc phục điều này với một quá trình gồm nhiều bước:

  • theo dõi các tế bào có chứa các trường văn bản mong muốn để làm cho responder đầu tiên
  • tính NSIndexPath của ô được hiển thị và gọi [self.tableView scrollToRowAtIndexPath:atScrollPosition:animated:] để hiển thị ô xem
  • triển khai tableView:willDisplayCell:forRowAtIndexPath: để gọi becomeFirstResponder trên các tế bào mong muốn khi nó trở nên rõ ràng và nó phù hợp với tế bào hoặc chỉ số đường mong muốn

Bước cuối cùng rất quan trọng vì gọi becomeFirstResponder không làm bất cứ điều gì nếu người nhận không phải là một subview của bất kỳ cửa sổ.

+0

Bạn đề xuất thế nào để theo dõi ô có trường văn bản sẽ trở thành trả lời đầu tiên? Tôi có nên có một ivar có tên là 'activeCellIndexPath' và kiểm tra xem đường dẫn chỉ mục của ô hiện hoạt có khớp với đường dẫn chỉ mục của ô được chuyển thành tham số trong' tableView: willDisplayCell: forRowAtIndexPath: 'hay là có hiệu quả hơn/hiệu quả hơn tiếp cận? – BigLex

+0

Tôi sẽ thực hiện chính xác cách bạn mô tả nó. Hãy chắc chắn để xử lý các trường hợp mà bạn không muốn làm cho bất kỳ tế bào trả lời và 'nil' ra' activeCellIndexPath'. – jszumski

+0

Ok! cảm ơn ngài! – BigLex

3

Làm cho ô hiển thị bằng cách cuộn chế độ xem bảng, sử dụng scrollToRowAtIndexPath:atScrollPosition:animated:.

Ví dụ

- (void)prevButtonPressedInCell:(MUInfoMateriaTableViewCell *)cell 
{ 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
    NSIndexPath *previousIndexPath = [NSIndexPath indexPathForRow:indexPath.row-1 inSection:indexPath.section]; 

    [self.tableView scrollToRowAtIndexPath:previousIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

    MUInfoMateriaTableViewCell *newCell = (MUInfoMateriaTableViewCell *)[self.tableView cellForRowAtIndexPath:previousIndexPath]; 
    [newCell.textField becomeFirstResponder]; 
} 
-1

Vấn đề là phương thức -cellForRowAtIndexPath: trả về ô chỉ khi ô hiển thị.

Đó là do ô không tồn tại khi hàng của nó không hiển thị. UITableView chỉ giữ những ô mà nó cần để vẽ bảng. Đó là lý do tại sao bạn nhận được rất nhiều thông báo -tableView:cellForRowAtIndexPath: khi bạn cuộn bảng - bảng đang yêu cầu nguồn dữ liệu của nó để cung cấp các ô mà nó không có.

Nếu bạn muốn sử dụng cách tiếp cận hiện tại, bạn sẽ cần cuộn bảng để hàng sắp sửa được hiển thị, như được minh họa trong câu trả lời của Gabriele Petronella.

+0

Đây chỉ là sai. Nhìn vào một thực hiện điển hình của 'tableView: cellForRowAtIndexPath:' và bạn sẽ thấy điều gì xảy ra. Nó luôn trả về một ô, nhưng nó có thể phải xây dựng một ô mới cho đường dẫn chỉ mục đó nếu nó hiện không hiển thị. Hoặc nó vẫn có thể có nó trong bộ nhớ cache của nó trong trường hợp nó sẽ khử và trả lại ô đã tồn tại. – Logachu

+0

@Logachu Câu trả lời của tôi là chính xác trong ngữ cảnh của câu hỏi gốc, nhưng chỉnh sửa không chính xác đã thay đổi '-cellForRowAtIndexPath:' (một phương thức UITableView) thành '-tableView: cellForRowAtIndexPath:' (phương thức UITableViewDataSource), thay đổi câu hỏi. Nó phải đã xảy ra vào khoảng thời gian mà tôi đã trả lời, bởi vì tôi đã sao chép văn bản không đúng vào câu trích dẫn trong câu trả lời của tôi. Tôi đã cố định báo giá và câu hỏi, và nếu bạn đọc câu trả lời của tôi với UITableView trong tâm trí (và có thể kiểm tra [các tài liệu] (http://bit.ly/KF1He4)) Tôi hy vọng bạn sẽ đồng ý rằng nó là chính xác. – Caleb

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