将单元格推送到DetailView时崩溃,当它是使用XCode 4的UISCrollView时

时间:2012-07-17 14:09:55

标签: xcode uitableview uiview uiscrollview uistoryboard

我使用此代码从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.
}

我已经将“detail1Scroller”连接到Connections Inspector中的UISCrollView,并在Identity Inspector中将Detail1ViewController写为Detail1ViewController的类。但是当我要去详细视图时应用程序崩溃了!

我注意到在我正在关注的教程中,UIScrollView被置于UIView上,我在项目中没有这样做。所以我尝试在UIView中创建一个带有UIScrollView的TestViewController,但是然后在Connections Inspector中没有像在教程中那样显示“detail1Scroller”Outlet!有人可以帮我解决这个问题,并且还要明确我是否应该使用带有UIView的UIScrollView。

1 个答案:

答案 0 :(得分:1)

故事板是一种配置视图控制器实例的方法,可以通过segue自动反复实例化,也可以手动使用代码反复实例化。当您在故事板中设计视图控制器时,您不是在设计类,而是在设计类的特定实例。在故事板中具有相同视图控制器类的两个实例是合法的,具有不同的视图布局。

这意味着如果您直接分配视图控制器类的实例,它将不会包含您在故事板中指定的所有UI。这有效地发生在这段代码中:

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

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

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

您的代码应如下所示:

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

如果您使用此代码为视图控制器使用故事板,则还应考虑使用segue来启动此转换。