2011-09-08 12 views
6

tableView가 내 사용자 정의 하위 클래스에 속하도록 UITableViewController를 설정하려고합니다. 내 loadView 메서드는 현재 다음과 같습니다.UITableViewController 하위 클래스의 loadView 재정의

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

위의 메서드를 주석 처리하면 나중에 충돌이 발생합니다. 뭔가 빠져 있습니다. 근데 뭐?

Apple 설명서 says loadView에서 super를 호출하면 안됩니다. 어떤 의미가 있습니다. 왜냐하면 저는보기가 자신의 수업이 아닌 수업을 갖기를 원하기 때문입니다. 그것은 일반 jQuery과 생성되도록

    가에는 loadView 메소드를 다시 작성
  • : 도움이되지 않습니다 내가 해봤

    것. 이것은 문제의 원인이 내 서브 클래스의 구현에 있지 않다는 것을 알려줍니다.

  • 내 loadView 메소드에서 [super viewDidLoad]를 호출하십시오. Apple의 문서에서,이 메소드가 loadView에서 호출되는지 또는 이후에 호출되는지는 분명하지 않습니다. 어쨌든, 내 loadView 메소드의 끝에 그것을 추가하는 것은 도움이되지 않습니다.

    • 주석으로 내에는 loadView 방법 :이 문제를 해결 않지만, 목적을 패배 내가 해봤

    한 가지.

편집 : 충돌이 아래에 나와 있습니다. 사용자가 입력을 한 후에 발생합니다. 내 하위 클래스 대신 일반 UITableView를 만드는 경우에도 같은 방식으로 발생합니다. 응용 프로그램에서 많은 일이 발생하고 있으며 내 loadView 재정의 (또는 내 재정의에서 누락 된 항목)로 상태가 달라지면서 충돌이 발생합니다. 그러나 나는 다른 것을 추적하는 좋은 방법을 보지 못합니다.

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

크래시 로그의 내용을 알려주십시오. - 고마워요 – Madhu

+0

충돌에서 콘솔 출력을 추가 할 수 있습니까? – chown

답변

12

밖으로 나옵니다. 데이터 소스를 설정하고 테이블 뷰의 위임을로드의 일부로해야합니다. 그래서 이렇게하면 모든 것이 잘 작동합니다.

- (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 자동 꺼내기 부분에 대해! 매우 중요. –

+0

질문이 있습니다. 이 접근 방식은 MVC의 목적을 이길 수 있습니까? 이제 컨트롤러는 컨트롤러를 서브 클래스 화하고 loadView를 다시 오버라이드하지 않는 한 하나의 테이블 유형에서만 작동하기 때문에? –

+0

MVC에 대한 질문에 ViewController는 View에 묶여있을 수 있지만 Controller를 View와 분리하면 MVC 모델에 더 잘 들어 맞습니다. ViewController의 View, Controller 코드에서 코드를 봅니다. 이와 같은 분리가 없으면 모든 코드를 하나의 ViewController에 덤핑합니다. – AgentK

1

윌리엄의 대답은 마지막 장애물에 대해서도 도와줍니다.

가 신속 예를 추가하려면, 내가 자주 사용 패턴은 다음과 같습니다

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 
    } 

} 

당신은 다음의 ViewController에서 다른 장소에서 childView로 사용자 정의보기를 참조 무료입니다.

관련 문제