せっかくPOSTもできるようになったんで、HTTPサーバから返ってくるHTML文をレンダリングしてみたいな~とか思ってUIWebViewを調べてみました。
したら
な~んていう、いかにもなメソッドがあったんですわ。
もしかして、今、rssAppDelegateのconnection:didReceiveData:メソッドでputcharしてる文字列を渡してやったら画面に表示しくれるのでは?
というわけで無理矢理UIWebViewをUITableViewCellに埋め込んじゃいます。
まずは、rssAppDelegateクラスに
という変数を追加。connection:didReceiveData:メソッドに渡ってくる受け取りデータをこいつに保存。
でNSURLConnectionクラスのconnectionWithRequestで指定するdelegateのメソッドである
を追加実装。こいつは、通信が完了した時に呼び出されるので、この呼び出しのタイミングで受け取るべきデータはすべてもらったと考えられる。
なので、このメソッドの中でUIWebViewのloadHTMLString:baseURL:メソッドを呼び出しちゃうわけです。
肝心のUIWebViewはUITableViewCellに埋め込むという事で、RootViewControllerをちょっといじります。
viewDidLoadメソッドではUITableViewの行の高さと、rssAppDelegateからUITableViewを探し当てるためのタグ付け。
タグについては「iPhoneアプリ開発、その(33)」の最後あたりを参照。
ついで
では1を返すようにする。こいつはテーブルがいくつの行を持つかを返すことになってて、前回は0を返していた。今回はUIWebViewを持つ行をひとつ用意するので1を返す。
で、実際にUIWebViewを行に埋め込むのが
こいつは、もともとUITableViewCellを準備する所までは記述してくれているので、後は用意されたUITableViewCellにUIWebViewを埋め込むだけ。
このメソッドが何をやっているかというのはエリカ本が詳しいんで買って読んでね、で済ませたいんだけど一応説明。
UITableViewは、テーブルの1行1行に別のUITableViewCellが割り当てられていて、内容部を自由に設定できるようになっています。
今回のような行が1つの場合、1回だけこのメソッドが呼ばれて1行目のUITableViewCellを作ってくださいとなるわけです。
で、もしこれが、1000、10000行とかになると、とてもメモリが足りないわけでして...
![テン・シー・シー-1](https://stat.ameba.jp/user_images/20091013/23/xcc/96/55/j/o0422053710275509411.jpg?caw=800)
じゃ、どうするかというと、スクロールされて画面外になったやつはしばらく用がないので、新しく表示される行のUITableViewCellとしてリサイクルしちゃえー、ただし行の内容部はこっちじゃわからんので、delegateさんお願い!というメソッドなわけです。
![$テン・シー・シー-2](https://stat.ameba.jp/user_images/20091013/23/xcc/48/70/j/o0532051710275520970.jpg?caw=800)
dequeueReusableCellWithIdentifierがリサイクルするべきUITableViewCellがないかの確認で、なければ新規にUITableViewCellを作っています。ここでUIWebViewを埋め込んでWEB_VIEW_TAGのタグを付ける。
で、rssAppDelegateのconnectionDidFinishLoading:メソッドで
として一番上の行のUITableViewCell(上では単にUIViewで使用)に埋め込まれたUIWebViewを取り出して
としました。baseURLが必要となるのはHTML文の中に相対パス"../image.jpg"みたいな表記があったときに位置を特定するためでしょうね。
![$テン・シー・シー-3](https://stat.ameba.jp/user_images/20091014/00/xcc/a1/60/j/o0202036910275529598.jpg?caw=800)
こんな感じで表示される
ちゅーわけで、なんとなくHTML文にも対応できそうな感じで、次回はサーバ側のPHPをいじって掲示板を作ってみる。
------------
サンプルソース:rss3.zip
したら
loadHTMLString:baseURL:
な~んていう、いかにもなメソッドがあったんですわ。
もしかして、今、rssAppDelegateのconnection:didReceiveData:メソッドでputcharしてる文字列を渡してやったら画面に表示しくれるのでは?
というわけで無理矢理UIWebViewをUITableViewCellに埋め込んじゃいます。
まずは、rssAppDelegateクラスに
NSString* htmlstring;
という変数を追加。connection:didReceiveData:メソッドに渡ってくる受け取りデータをこいつに保存。
でNSURLConnectionクラスのconnectionWithRequestで指定するdelegateのメソッドである
- (void)connectionDidFinishLoading:(NSURLConnection*)connection
を追加実装。こいつは、通信が完了した時に呼び出されるので、この呼び出しのタイミングで受け取るべきデータはすべてもらったと考えられる。
なので、このメソッドの中でUIWebViewのloadHTMLString:baseURL:メソッドを呼び出しちゃうわけです。
肝心のUIWebViewはUITableViewCellに埋め込むという事で、RootViewControllerをちょっといじります。
viewDidLoadメソッドではUITableViewの行の高さと、rssAppDelegateからUITableViewを探し当てるためのタグ付け。
self.tableView.rowHeight = TABLE_ROW_HEIGHT;
self.tableView.tag = TABLE_VIEW_TAG;
タグについては「iPhoneアプリ開発、その(33)」の最後あたりを参照。
ついで
tableView:numberOfRowsInSection:メソッド
では1を返すようにする。こいつはテーブルがいくつの行を持つかを返すことになってて、前回は0を返していた。今回はUIWebViewを持つ行をひとつ用意するので1を返す。
で、実際にUIWebViewを行に埋め込むのが
tableView:cellForRowAtIndexPath:
こいつは、もともとUITableViewCellを準備する所までは記述してくれているので、後は用意されたUITableViewCellにUIWebViewを埋め込むだけ。
if (cell == nil) {
cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
UIWebView* webView = [[UIWebView alloc]
initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, TABLE_ROW_HEIGHT)];
webView.tag = WEB_VIEW_TAG;
[cell addSubview:webView];
}
このメソッドが何をやっているかというのはエリカ本が詳しいんで買って読んでね、で済ませたいんだけど一応説明。
UITableViewは、テーブルの1行1行に別のUITableViewCellが割り当てられていて、内容部を自由に設定できるようになっています。
今回のような行が1つの場合、1回だけこのメソッドが呼ばれて1行目のUITableViewCellを作ってくださいとなるわけです。
で、もしこれが、1000、10000行とかになると、とてもメモリが足りないわけでして...
![テン・シー・シー-1](https://stat.ameba.jp/user_images/20091013/23/xcc/96/55/j/o0422053710275509411.jpg?caw=800)
じゃ、どうするかというと、スクロールされて画面外になったやつはしばらく用がないので、新しく表示される行のUITableViewCellとしてリサイクルしちゃえー、ただし行の内容部はこっちじゃわからんので、delegateさんお願い!というメソッドなわけです。
![$テン・シー・シー-2](https://stat.ameba.jp/user_images/20091013/23/xcc/48/70/j/o0532051710275520970.jpg?caw=800)
dequeueReusableCellWithIdentifierがリサイクルするべきUITableViewCellがないかの確認で、なければ新規にUITableViewCellを作っています。ここでUIWebViewを埋め込んでWEB_VIEW_TAGのタグを付ける。
で、rssAppDelegateのconnectionDidFinishLoading:メソッドで
UITableView* tv = (UITableView*)[self.window viewWithTag:TABLE_VIEW_TAG];
NSIndexPath* index = [NSIndexPath indexPathForRow:0 inSection:0];
UIView* cell = (UIView*)[ cellForRowAtIndexPath:index];
UIWebView* webView = (UIWebView*)[cell viewWithTag:WEB_VIEW_TAG];
として一番上の行のUITableViewCell(上では単にUIViewで使用)に埋め込まれたUIWebViewを取り出して
[webView loadHTMLString:(NSString *)htmlstring
baseURL:[NSURL URLWithString:@"http://localhost/test.php"]];
としました。baseURLが必要となるのはHTML文の中に相対パス"../image.jpg"みたいな表記があったときに位置を特定するためでしょうね。
![$テン・シー・シー-3](https://stat.ameba.jp/user_images/20091014/00/xcc/a1/60/j/o0202036910275529598.jpg?caw=800)
こんな感じで表示される
ちゅーわけで、なんとなくHTML文にも対応できそうな感じで、次回はサーバ側のPHPをいじって掲示板を作ってみる。
------------
サンプルソース:rss3.zip