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 只是一个 UIScrollView,后面没有 UIView。

这是 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”插座没有像教程中那样显示在 Connections Inspector 中!有人可以帮我解决这个问题,并明确我是否应该使用带有 UIView 的 UIScrollView 。

4

1 回答 1

1

故事板是一种配置视图控制器实例的方法,并通过 segues 自动或手动使用代码一遍又一遍地实例化它们。当您在情节提要中设计视图控制器时,您不是在设计类,而是在设计该类的特定实例。在故事板中有两个相同视图控制器类的实例是合法的,具有不同的视图布局。

这意味着如果您直接分配视图控制器类的实例,它不会附带您在情节提要中指定的所有 UI。这实际上是这段代码发生的事情:

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

即使您没有在 Xcode 中设计 XIB/NIB,您也指定了一个 NIB 名称,这也存在一些混淆。

要分配您在情节提要中设计的视图控制器的新副本,您应该使用 -[UIStoryboard instantiateViewControllerWithIdentifier:] 方法。标识符值应与故事板身份检查器中的值匹配。

您的代码应如下所示:

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

如果您使用此代码为视图控制器使用情节提要,您还应该考虑使用 segue 来启动此转换。

于 2012-07-18T20:37:12.590 回答