2011-09-08 27 views
6

Tôi đang cố gắng thiết lập UITableViewController sao cho tableView của nó thuộc về lớp con tùy chỉnh của tôi. Phương thức loadView của tôi hiện tại trông giống như sau:ghi đè trọng tảiXem trong lớp con UITableViewController

- (void) loadView { 
    MyTableViewSubclass* tv = [[[MyTableViewSubclass alloc]initWithFrame: CGRectZero style: UITableViewStylePlain]autorelease]; 
    self.view = tv; 
    self.tableView = tv; 
} 

Tôi gặp trục trặc sau này sẽ biến mất nếu tôi nhận xét phương pháp trên. Vì vậy, một cái gì đó là mất tích. Nhưng cái gì?

Tài liệu của Apple says Tôi không nên gọi siêu trong loadView. Điều đó có ý nghĩa, bởi vì tôi muốn xem có lớp học của tôi, không phải của họ.

Những điều tôi đã cố gắng mà không giúp:

  • Viết lại phương pháp loadView để nó đang tạo ra một UITableView đồng bằng. Điều này cho tôi biết rằng nguồn gốc của vấn đề không nằm trong việc thực hiện lớp con của tôi.
  • Gọi [super viewDidLoad] từ phương thức loadView của tôi. Từ tài liệu của Apple, tôi không rõ liệu phương thức đó được gọi từ loadView hay sau đó. Trong mọi trường hợp, việc thêm nó vào cuối phương thức loadView của tôi không giúp ích gì.

Một điều tôi đã cố gắng mà không sửa chữa được vấn đề, nhưng đánh bại mục đích:

  • luận ra phương pháp loadView của tôi.

CHỈNH SỬA: sự cố được hiển thị bên dưới. Nó xảy ra sau khi người dùng thực hiện một số đầu vào. Nó cũng xảy ra theo cùng một cách nếu tôi tạo một UITableView đơn giản thay vì lớp con của tôi. Có rất nhiều thứ đang diễn ra trong ứng dụng và một thứ gì đó trong ghi đè loadView của tôi [hoặc nhiều khả năng, cái gì đó bị thiếu trong ghi đè của tôi] đang khiến trạng thái khác nhau, điều này dẫn đến sự cố. Nhưng tôi không thấy một cách tốt để theo dõi những gì là khác nhau.

2011-09-08 12:44:59.591 MyAppName[97649:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[MyTableViewSubclass scrollToRowAtIndexPath:atScrollPosition:animated:]: row (0) beyond bounds (0) for section (0).' 
+0

Bạn có thể cho chúng tôi biết nhật ký sự cố nói gì không? -Cảm ơn – Madhu

+0

Bạn có thể thêm đầu ra của bảng điều khiển từ sự cố không? – chown

Trả lời

12

Hóa ra tôi cần đặt dữ liệuNguồn và ủy quyền của bảngView là một phần của quá trình tải. Vì vậy, khi tôi làm điều này, mọi thứ hoạt động tốt:

- (void) loadView { 
    MyTableViewSubclass* tv = [[[MyTableViewSubclass alloc]initWithFrame: CGRectZero style: UITableViewStylePlain]autorelease]; 
    tv.dataSource = self; 
    tv.delegate = self; 
    self.view = tv; 
    self.tableView = tv; 
} 
+0

+1 cho phần tự động sửa lỗi! rất quan trọng. –

+0

Tôi có một câu hỏi. Cách tiếp cận này không đánh bại mục đích của MVC? Bởi vì bây giờ bộ điều khiển chỉ làm việc với một loại bảng trừ khi bạn phân lớp bộ điều khiển và ghi đè loadView một lần nữa? –

+0

Về câu hỏi của MVC, ViewController có thể được gắn với View bây giờ, nhưng nó phù hợp hơn với một mô hình MVC bằng cách tách Controller khỏi View. Xem mã trong View, Controller code trong ViewController. Nếu không có một sự tách biệt như thế này bạn đang đổ tất cả các mã vào một ViewController. – AgentK

1

Câu trả lời của William cũng giúp tôi vượt qua rào cản cuối cùng.

Để thêm một ví dụ nhanh chóng, mô hình tôi thường sử dụng là:

class SomeTableViewController: UITableViewController { 

    private var childView: SomeTableView! { return tableView as! SomeTableView } 

    override func loadView() { 
     tableView = SomeTableView(frame: UIScreen.mainScreen().bounds, style: .Plain) 
     tableView.delegate = self 
     tableView.dataSource = self 
     view = tableView 
    } 

} 

Bạn đang sau đó tự do tham khảo quan điểm tùy chỉnh như childView ở những nơi khác trong ViewController.

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