关于interface的基本术语
*Viewcontroller:用来处理user和app的交互。
*View:它表示user在app上看到的界面,一个app可以有多个view。当然一个view就会对应一个viewcontroller
* Scene:viewcontroller + view就可以看作是一个scene.
* Segue:A segue表示scene之间的切换。有几种类型的Segue,使用哪种取决于你使用哪个类型的viewcontroller
* Modalview:就是会弹出一个view,你只能在该view上操作,而不能切换到其他view,除非你关闭了modalview.Modal View对应的segue type就是modal segue
* Relationship:A “segue” ofsorts for certain types of view controllers, such as the tab bar controllerRelationshipsarecreated between buttons on a master tab bar that display independent sceneswhen touched.
*Storyboard:包含所有的scene, segue, andrelationship definitions
往storyboard添加新的view controller后,该scenename总是"View controller scene",如何修改它?选中该scene的"viewcontroller" node,然后在右边panel的identityinspector里找到"Identity > Label",修改它。
SharingProperties and Methods with#importand@class
Class A要引用到Class B,那么就要在classA里import class B。
例如,if MyEditorClass needs to access properties and methods inMyGraphicsClass, MyEditorClass.h would include#import “MyGraphicsClass.h”at its start.
问题来了,若Class之间相互引用,例如classA引用class B,class B同时也引用classA,那么两边都import对方时会出错。因此就要在.h里使用@class,在.m里使用#import.而且使用@class,编译会快。
所以不管是不是相互引用,我觉得最好都在.h里使用@class,在.m里使用#import,省心!
参考文档:
http://blog.prosight.me/index.php/2009/09/347
http://blog.eddie.com.tw/2010/12/08/class-directive-in-objective-c/
Creatinga Segue
很简单,只需要选中该button,然后按住Ctrl,drag到要切换到的view即可。
当你drag and release mouse后,在targetview里会弹出一个菜单让你选择Seguetype。主要有5个segue types (大部分情况下使用Modalsegue type):
*Modal:Transition to another scene for the purposes ofcompleting a task.当user在弹出的modalview里操作完后,就应该dismiss themodal view scene然后切换回the originalview.
*Push:Create a chain of scenes where theuser can move forward or back.该segue type是和navigation viewcontrollers一起使用。
*Replace (iPad only):Replace thecurrent scene with another. This is used in some specialized iPad viewcontrollers (e.g. split-view controller).
*Popover(iPad only):Displays thescene in a pop-up “window” over top of the current view.
*Custom:Used for programming a customtransition between scenes.
Configuringa Segue
一旦创建了Segue,就会在对应的Scene的"viewcontroller"里面添加了一个"Seguefrom <origin> to <destination>" node。
选中该node,在右边的Utilitiespanel里可以对Segue进行设置。
其中最重要的是"Identifier"属性,通过它你可以手动(即写代码)来trigger a segue,还可以在有多个segues时进行识别。即使你不使用多Segue,也建议为segue设置"Identifier"
ControllingModal Segues Manually
上面创建的segue不需要写任何代码就可以实现clicka button就会切换到另一个view。但有时我们还是需要通过代码来trigger一个segue来进行view切换。比如收到一个message,就切换到显示该message的view,这就需要写代码来triggersegue。
在一个UIViewController里trigger segue来弹出modal view:
[selfperformSegueWithIdentifier:@”toMyGame” sender:self];
第一个参数就是segueidentifier.
Modal view关闭自己并返回到originalview (这个功能必须通过代码,因为在storyboard里没有反向seguefor modal):
[selfdismissViewControllerAnimated:YES completion:nil];
注意:这行代码可以写在Modalview controller里,也可以写在originalview controller。
Programminga Modal Scene Switch
上面2 part都是讲解通过Segue来切换view/scene。这部分讲解如何不通过Segue,而直接写代码来实现ModalScene切换(即写代码来实现Segue的功能)。
step 1 获取storyboard实例:
UIStoryboard*mainStoryboard=[UIStoryboard storyboardWithName:@”MainStoryboard” bundle:nil];
step 2 获取view and view controller 实例:
EditorViewController*editorVC=[mainStoryboard instantiateViewControllerWithIdentifier:@”myEditor”];
step 3 用代码手动设置view的displaystyle为modal:
editorVC.modalTransitionStyle=UIModalTransitionStyleCoverVertical;
editorVC.modalPresentationStyle=UIModalPresentationFormSheet;
> Transition styles:
UIModalTransitionStyleCoverVertical,
UIModalTransitionStyleFlipHorizontal,
UIModalTransitionStyleCrossDissolve, or
UIModalTransitionStylePartialCurl
>Presentationstyles:
UIModalPresentationFormSheet,
UIModalPresentationPageSheet,
UIModalPresentationFullScreen, or
UIModalPresentationCurrentContext
step 4 显示view controller对应的view (上面的代码设置了该view以modalstyle显示)
[selfpresentViewController:editorVC animated:YES completion:nil];
Passing Data Between Original scene and Modal scene
注意:不同类型的scene,传递data的方式不同。Modal scene是使用presentingViewController, presentedViewController,而navigation controller和tab bar controller是使用parentViewController
如果你是象上part说的通过写代码来实现view切换,那么可以在获取下一个view的实例时,调用它的propertyor method来传递。例如在上part的代码中,you already have aninstance of the new scene’s view controller in
yourinitial view controller,Youcan set/access properties on the new view controller
(editorVC.myImportantProperty=<value>)beforedisplaying it and after it is dismissed.
而如果你是通过segue来切换view的话,那么你可以通过prepareForSegue:sendermethod来传递data。该方法是写在originalview controller里,当该controller trigger a segue来切换view时,会自动调用该方法。该方法有一个"segue"参数,它是UIStoryboardSegue对象,有2个很重要的属性"sourceViewController"and "destinationViewController",用来表示theview controller starting the segue (the source) and the view controller aboutto be displayed (the destination)
例:
-(void)prepareForSegue:(UIStoryboardSegue *)seguesender:(id)sender {
ViewController*startingViewController;
EditorViewController *destinationViewController;
startingViewController=(ViewController*)segue.sourceViewController;//注意:这里segue.sourceViewController可以用self代替
destinationViewController=(EditorViewController *)segue.destinationViewController;
destinationViewController.xxxxx=xxxx;//pass data
}
注意:若你的origin viewcontroller里定义了多个segue,那么每个segue被trigger时都会调用"prepareForSegue"方法,怎样区别是哪个segue被trigger?就要用到segue identifier:
-(void)prepareForSegue:(UIStoryboardSegue *)seguesender:(id)sender {
if ([segue.identifierisEqualToString:@”myAwesomeSegue”]) {
//Do something unique for this segue
}
}
prepareForSegue method只提供了从originalview传data给modal view的通道。当user在modalview操作完,在dismiss modal view时如何把data从modalview传回给original view?prepareForSegue method做不到回传data.
回传data,一个不值得推荐的方式就是:create a property on thedestination controller that stores a reference to the source controller.
另一个更简单的方法是使用UIViewController class的缺省built-inproperties:presentingViewControllerandpresentedViewController.
在modal view里如果要获取originalview,可以在modal view controller里调用
((ViewController*)self.presentingViewController).<property>
在original view里如果要获取目前已经在显示的modalview,则可以在original view controler里调用
((EditorViewController*)self.presentedViewController).<property>
那么上面所说的问题,就可以在modalview里通过presentingViewController来获取original view的引用。