6

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

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

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

Appleのドキュメントに、loadViewでsuperを呼び出すべきではないと書かれています。これは理にかなっています。なぜなら、ビューにクラスではなくクラスを持たせたいからです。

私が試したが役に立たないこと:

  • プレーンなUITableViewを作成するように、loadViewメソッドを書き直します。これは、問題の原因が私のサブクラスの実装にあるのではないことを示しています。
  • loadViewメソッドから[superviewDidLoad]を呼び出します。Appleのドキュメントから、そのメソッドがloadViewから呼び出されるのか、それ以降に呼び出されるのかはわかりません。いずれにせよ、loadViewメソッドの最後に追加しても役に立ちません。

私が試したことの1つは、問題を解決しますが、目的を達成できません。

  • 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).'
4

2 に答える 2

12

ロードの一部として、tableViewのdataSourceとデリゲートを設定する必要があることがわかりました。したがって、これを行うと、すべてが正常に機能します。

- (void) loadView {
   MyTableViewSubclass* tv = [[[MyTableViewSubclass alloc]initWithFrame: CGRectZero style: UITableViewStylePlain]autorelease];
   tv.dataSource = self;
   tv.delegate = self;
   self.view = tv;
   self.tableView = tv;
}
于 2011-09-08T18:04:59.610 に答える
2

ウィリアムの答えは、最後のハードルでも私を助けてくれます。

簡単な例を追加するために、私が一般的に使用するパターンは次のとおりです。

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として自由に参照できます。

于 2015-08-19T23:49:18.823 に答える