1

このチュートリアルに従って、簡単なRSSリーダーアプリを作成しようとしています。

Xcode 4.3.2を使用しているため、チュートリアルを少し調整する必要がありました。すべてが機能し、すべてのRSSフィードが正常に読み込まれますが、記事をクリックして表示すると、詳細ビ​​ューコントローラーが読み込まれますが、完全に空白になります。ストーリーボードのDetailViewControllerにラベルまたはボタンを追加しようとしましたが、ロード時にこれらも表示されません。表示されるのは上部のナビゲーションバーだけです。だから私の質問は私が間違っていることですか?コードの問題ではなく、単純なセットアップの問題だと確信しています。ビューに任意のオブジェクトを追加できますが、まったく異なるViewControllerがロードされているように表示されません。どんな助けでも大歓迎です。これが私が使用しているコードです:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    RSSEntry *entry = [_allEntries objectAtIndex:indexPath.row];
_webViewController.entry = entry;
[self.navigationController pushViewController:_webViewController animated:YES];

}


- (void)viewDidLoad
{

NSURL *url = [NSURL URLWithString:_entry.articleUrl];    
[self.webView loadRequest:[NSURLRequest requestWithURL:url]];
NSLog(@"The URL is %@",url);


}

このコードは古いバージョンのXcodeから採用されたものですが、個々のnibファイルではなく、ストーリーボードと関係がありますか?

OK_webviewControllerはRootViewController.hに設定されています

@interface RootViewController : UITableViewController <UITableViewDelegate> {
NSOperationQueue *_queue;
NSArray *_feeds;
NSMutableArray *_allEntries;
DetailViewController *_webViewController;

}

@property (retain) NSOperationQueue *queue;
@property (retain) NSArray *feeds;
@property (retain) NSMutableArray *allEntries;
@property (retain) DetailViewController *webViewController;

didselectRowAtIndexはRootViewControllerで設定され、viewDidloadはDetailViewControllerで設定されます

ストーリーボードにプッシュセグエを設定しました。

tableViewのdidSelectRowAtPathメソッドを以下に提案するメソッドに置き換えました

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// test segue.identifier if needed
DetailViewController *viewController = segue.destinationViewController;
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
// set properties of viewController based on selection indexPath
RSSEntry *entry = [_allEntries objectAtIndex:indexPath.row];
viewController.entry = entry;
}

残念ながら、これは問題なく機能しているように見えますが、まだ空白のビューが表示されます。

4

1 に答える 1

1

ここには複数の問題があります。

  1. _webViewControllerナビゲーションコントローラーにプッシュしようとする前に、何かに設定している場所がわかりません。これが、「アプリケーションが nil ビュー コントローラーをターゲットにプッシュしようとしました」というエラーが表示される理由であり、空白のビューが表示される理由に関連している可能性があります。

  2. 質問で引用した 2 つのメソッドは両方とも同じクラスに実装されていますか? おそらく、didSelectRowAtIndexPathテーブル ビュー コントローラー (Ray Wenderlich チュートリアルの RootViewController) にありviewDidLoad、Web ビュー コントローラーにあるのでしょうか? その場合は、質問する際にそのような情報を含めてください。そうでない場合は、それが問題の一部である可能性があります。

  3. 最も重要なことは、ストーリーボードを使用するようにチュートリアルを適応させようとしているように聞こえることです。プラス面としては、これは、そうでなければコードで行う必要がある多くのことを IB で行うことができることを意味します。欠点としては、これによりビュー コントローラー間のプログラムの「フロー」が大幅に異なるため、チュートリアルを解釈するのが少し難しくなります。

ストーリーボードを使用する場合の主な違いは、ストーリーボードがビュー コントローラーの作成とプッシュ/提示を担当することです。(ルート ビュー コントローラーに Web ビュー コントローラーのインスタンスを保持させて再利用させることは、とにかくアンチパターンでした。) ストーリーボードの世界で行う方法は次のとおりです。

  1. ストーリーボードに、ナビゲーション コントローラーに埋め込まれたルート テーブル ビュー コントローラーが既に含まれていると仮定するとUIViewController、ライブラリーから をドラッグして、そのクラス ID を に設定することにより、Web ビュー コントローラーをストーリーボードに配置しますWebViewController

  2. テーブル ビューのプロトタイプ セルから Web ビュー コントローラーに Control キーを押しながらドラッグし、プッシュ セグエにします。

    ドラッグしてセグエを作成

  3. 上記を使用すると、アプリを実行して、テーブル ビューから Web ビューに移動できます (コードなしで -- イェイ!)。そのため、テーブル ビュー コントローラーに次のコードを追加する必要があります。

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        // test segue.identifier if needed
        WebViewController *viewController = segue.destinationViewController;
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        // set properties of viewController based on selection indexPath
        RSSEntry *entry = [_allEntries objectAtIndex:indexPath.row];
        viewController.entry = entry;
    }
    
  4. 次に、Web ビューに URL をロードする Web ビュー コントローラーが必要になりviewDidLoadます。既に実装されている実装は、そのために適しているはずです。

于 2012-04-09T17:38:23.793 に答える