我使用此代码从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。
答案 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来启动此转换。