0

このコードを使用して、TableView から DetailView に移動します。

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:TRUE];
  if(indexPath.row==0) {

      //Initialize the detail view controller and display it.
      Detail1ViewController *firstDetailController = [[Detail1ViewController alloc] initWithNibName:@"Detail1ViewController" bundle:nil];
      [self.navigationController pushViewController:firstDetailController animated:YES];
      [firstDetailController release];
}
else if(indexPath.row==1) {

    //2nd view
}
else if(indexPath.row==2) {

    //3rd view
}
}

Storyboard の Detail1ViewController は、背後に UIView がない UIScrollView のみです。

これは Detail1ViewController.h です。

#import <UIKit/UIKit.h>

@interface Detail1ViewController : UIViewController {
 IBOutlet UIScrollView *detail1Scroller;
}

@end

そしてそれをロードするために.m:

- (void)viewDidLoad
{
[super viewDidLoad];
[detail1Scroller setScrollEnabled:YES];
[detail1Scroller setContentSize:CGSizeMake(320,1100)];
// Do any additional setup after loading the view.
}

Connections Inspector で「detail1Scroller」から UISCrollView に接続し、Identity Inspector で Detail1ViewController のクラスとして「Detail1ViewController」を記述しました。しかし、詳細ビューに移動するとアプリがクラッシュします!

私がフォローしているチュートリアルでは、UIScrollView が UIView に配置されていることに気付きましたが、これは私のプロジェクトでは行っていません。そこで、UIView 内の UIScrollView を使用して TestViewController を作成しようとしましたが、チュートリアルのように「detail1Scroller」アウトレットが接続インスペクターに表示されません! 誰かがこれを解決するのを手伝ってくれますか。また、UIScrollView を UIView の後ろで使用する必要があるかどうかを明確にしてください。

4

1 に答える 1

1

ストーリーボードは、View Controller のインスタンスを構成し、セグエを使用して自動的に、またはコードを使用して手動で何度もインスタンス化する方法です。ストーリーボードでビュー コントローラーを設計する場合、クラスを設計するのではなく、クラスの特定のインスタンスを設計します。異なるビュー レイアウトを使用して、ストーリーボードに同じビュー コントローラー クラスの 2 つのインスタンスを含めることは正当です。

つまり、View Controller クラスのインスタンスを直接割り当てた場合、ストーリーボードで指定したすべての UI が付属するわけではありません。それは事実上、このコードで何が起こっているかです:

Detail1ViewController *firstDetailController = [[Detail1ViewController alloc] initWithNibName:@"Detail1ViewController" bundle:nil];
[self.navigationController pushViewController:firstDetailController animated:YES];
[firstDetailController release];

また、Xcode で XIB/NIB を設計していないにもかかわらず、NIB 名を指定しているという点で少し混乱しています。

ストーリーボードで設計したビュー コントローラーの新しいコピーを割り当てるには、 -[UIStoryboard instantiateViewControllerWithIdentifier:] メソッドを使用する必要があります。識別子の値は、ストーリーボード ID インスペクターの値と一致する必要があります。

コードは次のようになります。

Detail1ViewController *firstDetailController = [[self storyboard] instantiateViewControllerWithIdentifier:/* my identifier */];
[self.navigationController pushViewController:firstDetailController animated:YES];

このコードでビュー コントローラーのストーリーボードを使用している場合は、セグエを使用してこの遷移を開始することも検討する必要があります。

于 2012-07-18T20:37:12.590 に答える