本文主要是介绍XCode学习随笔04--Storyboard配置初体验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
http://blog.sina.com.cn/s/blog_63fa2cac01018ypp.html
Storyboard是iOS5的新特性。使用Storyboard可以更方便的管理应用的界面,同时为视图间的跳转提供了清晰的脉络。
任何时候你都可以在你的项目中添加Storyboard,不管你创建项目的时候有没有勾选“UsbStoryboard”选项,如下图所示。
如果你创建的时候勾选了该选项,那么恭喜你,你已经有了一个Storyboard,并且被设为了MainStoryboard,如下图所示。
同时你的代理类是这样的:
- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOp
tions:(NSDictionary *)launchOptions { return YES;
}
这跟以前可大不一样了!这是因为程序会自动加载Main Storyboard。如果你把上面的MainStoryboard项清空了,那我们的MainStoryboard.storyboard就是一个孤立的文件了,你必须手动加载它,所以上面的代码也得改一改,如下:
- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOp
tions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
UIStoryboard *storyboard =[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
self.window.rootViewController =[storyboard instantiateInitialViewCo
ntroller]; [self.window makeKeyAndVisible];
return YES;
}
上面加粗的两句比较重要,前一句是从文件创建UIStoryboard实例对象,后一句则是从这个对象里获取“初始视图控制器”(一个storyboard里只可以设置一个初始视图控制器,相当于这个storyboard的入口,后面还会说到)。但如果你创建项目的时候没有勾选“Use Storyboard”项,那你就要手动添加Storyboard了,如下图所示。
手动创建的Storyboard和自动创建的没有任何不同,打开我们刚刚创建的Storyboard,里面什么都没有,我们不妨拖拽一个NavigationController到里面。
可以看到我们一次拖出了两个视图控制器,这是因为NavigationController需要一个rootViewController。注意我标注的两个小箭头,左边的代表这是一个“初始视图控制器”,右边的代表两个视图控制器之间的关系。选中视图控制器可查看属性。
取消勾选“Is Initial ViewController”后指向视图控制器的箭头也就消失了。再次说一下,一个Storyboard里只能有一个“初始视图控制器”。
下面要做的是在根控制器中添加一个button,然后继续拖拽一个ViewController,点击button新ViewControllerpush进来。
首先添加button,就跟使用IB一样。这次我们拖拽一个UITabbarController,这时如下图所示。
接下来有两种方法:第一种:我们可以直接在Storyboard中完成,按住ctrl从button连接到TabbarController,松开并选择push,这样我们就创建了一个segue(UISotryboardSegue)。
保存并运行
我们没有写任何代码就已经完成了一个简单的框架。
下面是第二种方法:我们准备用代码来实现。(记得把上一步中push类型的segue删除。)首先创建类FirstViewController(Subclass ofUIViewController),然后将RootViewController的底层类改为FirstViewController,如下图。
继续选中TabbarController,并设置Identifier为“second”。
在FirstViewController.m中添加下面的方法并连接到button。
- (IBAction)pressed
{
UIStoryboard *board=[UIStoryboardstoryboardWithName:@"MainStoryboard" bundle:nil];
UITabBarController*nextViewController =[boardinstantiateViewControlle
rWithIdentifier:@"second"] ;[self.navigationControllerpushViewController:nextViewController animated:YES];
}
加粗的代码展示了如何使用Identifier从Storyboard中获取指定的视图控制器。保存并运行,效果和前一种方法完全相同。
下面我们将完成另一个目标:手动触发一个segue。(Storyboard里无法创建一个通过touch来触发的segue。)
拖拽一个UIViewController,按住ctrl从TabbarController的第一个分支连接到新的viewController,同样选择push。
选择刚刚创建的segue并设置Identifier为“touch topush”,然后设置新viewController的Identifier为“third”。(Identifier只是一个名称没有实际意义,可以随便设置。)
添加新类SecondViewController(Subclass ofUIViewController),选中第一个分支并设置其底层类为SecondViewController。然后添加如下方法。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event
{
[selfperformSegueWithIdentifi
er: @"touch to push"sender:nil];}
明白这个方法后就可以用任何类型的事件去触发我们在Storyboard中创建的segue了。
继续下一个目标:在segue被触发的时候传递参数到目标视图控制器。
删除TabbarController的第二个分支,拖拽一个UITableViewController,按住ctrl从TabbarController连接到UITableViewController,松开并选择relationship。选中cell设置Identifier为“cell”。然后再拖拽一个UIViewController,并添加一个UILabel。作如下操作。
添加类ThirdViewController(Subclass ofUITableViewController)和类FourthViewController(Subclass ofUIViewController),分别设置为最后两个视图控制器的底层类。
ThirdViewController.m
- (NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section
{
return 20;
}
- (UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier =@”cell“;
UITableViewCell *cell = [tableViewdequeueReusableCellWithI
dentifier:identifier]; if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefa
ultreuseIdentifier:identifier]; }
cell.textLabel.text = [NSStringstringWithFormat:@"%d",indexPath.row];
return cell;
}
- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
//这里我很谨慎的对sender和目标视图控制器作了判断
if ([senderisKindOfClass:[UITableViewCell class]]) {
if ([segue.destinationViewControlle
risKindOfClass:[FourthViewController class]]) { NSIndexPath *indexPath =[self.tableView indexPathForCell:sender];
FifthViewController*nextViewController = segue.destinationViewControlle
r; nextViewController.string = [NSStringstringWithFormat:@"%d",indexPath.row];
}
}
}
FourViewController.h
@interface FifthViewController : UIViewController
{
IBOutlet UILabel *label;
}
@property (nonatomic,strong) NSString *string;
FourthViewController.m
@synthesize string;
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
label.text = self.string;
}
segue包含属性sourceViewController和destinationViewControlle
保存并运行
这篇关于XCode学习随笔04--Storyboard配置初体验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!