2011-09-08 3 views
6

UITableViewControllerをセットアップしてtableViewが自分のカスタムサブクラスに属するようにしようとしています。私のloadViewメソッドは現在次のようになっています:UITableViewControllerサブクラスのloadViewをオーバーライドする

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

上記の方法をコメントアウトすると、後でクラッシュすることがあります。だから何かが欠けている。しかし何?

Appleのマニュアルsays loadViewでsuperを呼び出すべきではありません。私は自分のクラスではなく、自分のクラスを持たせたいので、意味があります。助けていない、私が試した

物事:それは、プレーンのUITableViewを作成するように、

    はloadViewメソッドを書き直し
  • 。これは、問題の原因が私のサブクラスの実装にあるのではないことを私に伝えます。
  • loadViewメソッドから[super viewDidLoad]を呼び出します。 Appleのドキュメントから、そのメソッドがloadViewから呼び出されたのかどうかは不明です。どのような場合でも、loadViewメソッドの最後に追加することは役に立ちません。

    • コメントアウト私のloadViewメソッド:問題を解決しますが、目的に反し、私が試した

    一つ。

EDIT:クラッシュを以下に示します。ユーザーが何らかの入力をした後に起こります。私のサブクラスの代わりにプレーンな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

クラッシュログの内容をお知らせください。 -Thanks – Madhu

+0

クラッシュからコンソール出力を追加できますか? – chown

答えて

12

私はtableSourceのdataSourceと委譲を設定する必要があります。私はこれを行うときに、すべてが正常に動作します:

- (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を再度オーバーライドしない限り、コントローラは1つのタイプのテーブルでしか動作しないからです。 –

+0

MVCに関する質問では、ViewControllerはViewに結びついているかもしれませんが、ViewからControllerを分離することで、MVCモデルに適しています。 ViewControllerのView、Controllerコードのコードを表示します。このような分離がなければ、すべてのコードを1つの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としてカスタマイズされたビューを参照するのは自由です。

関連する問題