0

いくつかのチュートリアルを行った後、最初の iOS アプリを作成しようとしています。私は、ニューオーリンズ・セインツの見出しとストーリーを json として ESPN API から取得し、見出しをテーブル ビューに表示し、ユーザーが見出しをタップするとストーリーのテキストを詳細ビューに表示する単純な見出し/ニュース リーダーを作成しています。 .

アプリは、エラーや警告なしでコンパイルおよび実行されます。prepareForSegue メソッドは、ユーザーが上部のテーブルビューで見出しをタップすると実行されます。デバッガーでこのコードをステップ実行できます。prepareForSegue メソッドをステップ実行すると、detailViewController の setStory メソッドが呼び出され、次に configureview メソッドが呼び出されます。しかし、その後 main.m に移動し、詳細ビューを表示せずにアプリを閉じます。

私は初心者です。私は何が欠けていますか?詳細ビューが表示されないのはなぜですか? IBOutlet をロードするために IBAction が必要なのでしょうか?

saintsMasterViewController.m

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        saintsDetailViewController *detailViewController = [segue destinationViewController];
        saintsNewsStory* displayThisStory =[self.dataController objectInListAtIndex:[self.tableView indexPathForSelectedRow].row];
        [detailViewController setStory:displayThisStory];
    }
}

saintsDetailViewController.m

- (void)setStory:(saintsNewsStory *)newStory
{
 //   if (_story != newStory) {
        _story = newStory;
        // Update the view.
     //   [self configureView];
  //  }
}


- (void)configureView
{
    self.storyText.text = self.story.storyText;
}

- (void)viewDidLoad     //the app never gets here. if i put a breakpoint here it never gets here
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self configureView];
}

saintsDetailViewController.h

@class saintsNewsStory;
@interface saintsDetailViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextView *storyText;
@property (retain, nonatomic) saintsNewsStory *story;
@end

コンソールに次のエラーが表示されます。

SaintsHeadlineReader[9608:11303] * キャッチされない例外 'NSUnknownKeyException' が原因でアプリを終了します。理由: '[ setValue:forUndefinedKey:]: このクラスはキーの値のコーディングに準拠していません。* First throw call stack: (0x1c90012 0x10cde7e 0x1d18fb1 0xb7a711 0xafbec8 0xafb9b7 0xb26428 0x2320cc 0x10e1663 0x1c8b45a 0x230bcf 0xf5e37 0xf6418 0xf6648 0xf6882 0x102235 0x3013d2 0xff4f3 0xff777 0xff7b7 0x46afe2 0x45cad9 0x45cb54 0xc4899 0xc4b3d 0xacbe83 0x1c4f376 0x1c4ee06 0x1c36a82 0x1c35f44 0x1c35e1b 0x1bea7e3 0x1bea668 0x1565c 0x204d 0x1f75 0x1) libc++abi. dylib: 例外をスローして呼び出された終了

textview には詳細ラベルがあるようですが、そのためのアウトレットが必要だったのでしょうか。

4

2 に答える 2

0

この行を変更します:

saintsDetailViewController *detailViewController = [segue destinationViewController];

これに:

saintsDetailViewController *detailViewController = (saintsDetailViewController *)[segue destinationViewController];

編集:最初にビューを表示してから、configureViewメソッドを呼び出す必要があります。そのViewControllerを呼び出しconfigureViewてみてください。viewDidLoad

- (void)setStory:(saintsNewsStory *)newStory
{
 //   if (_story != newStory) {
        _story = newStory;
        // Update the view.
       // [self configureView];
  //  }
}


-(void) viewDidLoad {
      [self configureView];
}


- (void)configureView
{
    self.storyText.text = self.story.storyText; //the app gets to here but does not show the view. why?
}
于 2012-10-23T23:22:22.017 に答える
0

私の理論をテストします。現在使用している行の直前または直後にNSLog(@"%d", [self.yourTableView indexPathForSelectedRow].row);現在のメソッドを挿入し、コンソールで何が返されるかを確認します。おそらく0です。prepareForSegueindexPathForSelectedRow

UITableViewCell Prototype から DetailViewController にセグエを接続する代わりに、UITableViewController から DetailViewController に接続してから、以下のメソッドを使用します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    SaintsDetailViewController *detailViewController = [[SaintsDetailViewController alloc] init];
    saintsNewsStory* displayThisStory =[self.dataController objectAtIndex:indexPath.row];
    [detailViewController setStory:displayThisStory];
    [self performSegueWithIdentifier:@"showDetail" sender:indexPath];
}

そしてあなたのprepareForSegue:方法:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        saintsDetailViewController *detailViewController = [segue destinationViewController];
    }
}
于 2012-10-23T23:39:25.670 に答える