- 締切済み
[iPhoneアプリ開発]継承クラスを作らず
Objective-cでiPhoneアプリを作っています 自前でクラスを作らず(.hファイルと.mファイルを作らず)別のファイルで基本的なクラスのインスタンスを作ってその場で設定したいんですが、どうすればいいでしょうか。 例えば、ある画面のコード(ViewController.mにします)で UITableViewController *foo = [[UITableViewController alloc] initWithStyle:UITableViewStyleGrouped]; (TableViewを表示させたい) と書き、その画面(ViewController)内のボタンやラベルを押せばfooに遷移できるようにします。 すると、確かに遷移はできるのですが何も無いページが表示されるだけです。 TableViewなので設定(セクションのタイトルだとかセルの数だとかを決める)をしなければ何も表示されないのは当たり前ですよね。 この設定をViewController.m内で行いたいのです。 いつもならUITableViewControllerを継承したクラスを作りそこで設定を行なっていました。 今回はそれを作りたいくない、というわけです。 できますでしょうか。 ちなみに遷移に関してですが、NavigationControllerを想定しています。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- riding_heart
- ベストアンサー率64% (9/14)
>今回はそれを作りたいくない、というわけです。 という理由は、わかりませんが。 表の大きさや、中身の設定が、UITableViewControllerで行われるのは、UItableViewControllerが、 UItableViewDataSourceのプロトコルをconformしていて、UItavleViewのデータソースになっているから です。 つまり、UITableViewは、大きさや、中身を入れてくれるメソッドが、自分のdatasource で、UITableViewControllerになっているので、それを呼んでいるだけですが、あなたは、それをサブクラス化してオーバーライドしたくない、というので、ダミー処理のメソッドを呼ぶことになるので、真っ白けのテーブルが出てくるのです。 これを避けるためには ViewController で、<UITableViewDataSource> プロトコル対応の宣言を行い。 TableViewのdataSource に、ViewControllerを指定して、表の大きさ、中身を入れるプロトコルをViewController側で、実装する必要があります。 まぁ、そこまでして、UITableViewControllerのサブクラス化しないメリットがあるかは、謎ですが。 ドキュメントとしては、 UITableViewDataSource Protocol Reference UITableView Class Reference は、must read でしょう。
- chocolat0
- ベストアンサー率62% (5/8)
ViewController.m 内でテーブルを生成・表示できるようにさせたい。ということでしょうか? それでしたらViewController.hにテーブルビューのデリゲートとデータソースのプロトコルを宣言し ViewController.mでh.で宣言したプロトコルの呼び出し先を自身のインスタンスとした上で セクション・セル行数等のデリゲートメソッドを書いていけばできます。 と、こんな風に文字だけをズラズラと書いてもわかりにくいかと思うので簡単な例を。 (方法は何通りもありますが、紹介するのはstoryboardと組み合わせたやり方です。) (1) storyboardでviewController内にtableViewを作成。(注:tableView Controllerではない) tableViewをoutletでコネクト。(ここではオブジェクト名は、 tableView とする) (2) ~ .h ~ // プロトコル宣言。ここでUITableViewのDelegateとDataSourceを // このファイルで使うよ~ということを宣言・明示します。 @interface ViewController : ViewController<UITableViewDelegate, UITableViewDataSource> ~ .m ~ - (void)viewDidLoad { [super viewDidLoad]; // (1)で作成したtableViewのオブジェクトのdelegateとdataSoruceの呼び出し先を // 自身のインスタンスに指定。 // コードでUITableViewを生成、もしくはstoryboardで直接delegateとdataSourceに // コネクトさせてもいいですが、図がないと説明しずらいので今回はこれで。 self.tableView.delegate = self; self.tableView.dataSource = self; } あとはセクションやセルの行数等テーブル生成に必要な最低限のデリゲートメソッドを書けばOK。 その辺りはおわかりのようなので割愛します。 ベテランのプログラマーから見れば、少し変則的な方法かもしれません。 私自身勉強を始めてまだ数ヶ月程度の者です。 tableViewの扱いには相当悩まされて苦労したのですが、最終的に扱い易かったのが このやり方でした。 他にわかりやすい解答が得られればいいですが、こんなのでもお役に立てれば~。
お礼
回答ありがとうございます。 なんだか大変そうですね。 Objective-Cの知識が少ないんで諦めてサブクラス作ろうと思います。