在使用storyboard开发iOS应用时,从一个视图控制器的视图中点击一个按钮跳转到另外一个视图控制器的视图的操作开始使用segue实现。storyboard较之以前的nib最大的优点就是很直观地、图形化地展示各个视图控制器之间的关系。这个关系就是通过segue来实现。
通过segue,可以将一个视图控制器的数据传输到跳转到的另一个视图控制器上,再通过delegate是释放这个视图控制器并将新的数据传回来。这个segue的类型一般设置为modal。
(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1751623
)
第一个视图控制器LoginViewController,用来显示登录窗口。它的视图中有两个textfield,用于录入用户名和密码,一个button,点击该button,通过拖到目标视图控制器上的segue来实现视图切换。
它的代码如下:
#import <UIKit/UIKit.h>
@interface LoginViewController : UIViewController <UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *usernameInput;
@property (weak, nonatomic) IBOutlet UITextField *passwdInput;
@end
#import "LoginViewController.h"
#import "LogoffViewController.h"
@interface LoginViewController () <LogoffViewControllerDelegate>
@end
@implementation LoginViewController
@synthesize usernameInput=_usernameInput,passwdInput=_passwdInput;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"LogoffView"]) {
LogoffViewController * logoffController=[segue destinationViewController];
logoffController.u01=self.usernameInput.text;
logoffController.u02=self.passwdInput.text;
logoffController.delegate=self;
}
}
-(void)logoffViewControllerDone:(LogoffViewController *)controller username:(NSString *)username passwd:(NSString *)passwd
{
[self dismissViewControllerAnimated:YES completion:NULL];
NSLog(@"username is %@",username);
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if ((textField == self.usernameInput) || (textField == self.passwdInput)) {
[textField resignFirstResponder];
}
return YES;
}
@end
在prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender方法中,实现目标视图控制器属性的设置,实际上是将数据传输到目标视图控制器上,并设置目标视图控制器的委托为自己。
这样通过这个委托可以再切换回来。
在logoffViewControllerDone:(LogoffViewController *)controller username:(NSString *)username passwd:(NSString *)passwd方法中,实现目标控制器的委托的方法。
它会被目标视图控制器调用,将目标视图控制器的数据传过来,并释放目标视图控制器。
第二个视图控制器LogoffViewController,用来显示前一个视图控制器的切换窗口,有两个lable用来显示传输过来的用户名和密码信息,一个button用来释放自己,并回到前一个视图控制器窗口。
#import <UIKit/UIKit.h>
@protocol LogoffViewControllerDelegate;
@interface LogoffViewController : UIViewController
@property (strong,nonatomic) NSString *u01,*u02;
@property (weak, nonatomic) IBOutlet UILabel *username;
@property (weak, nonatomic) IBOutlet UILabel *passwd;
@property (weak,nonatomic) id <LogoffViewControllerDelegate> delegate;
- (IBAction)logOff:(id)sender;
@end
@protocol LogoffViewControllerDelegate <NSObject>
-(void)logoffViewControllerDone:(LogoffViewController *)controller username:(NSString *)username passwd:(NSString *)passwd;
@end
#import "LogoffViewController.h"
@implementation LogoffViewController
@synthesize u01=_u01,u02=_u02;
@synthesize delegate=_delegate;
@synthesize username=_username,passwd=_passwd;
- (void)viewDidLoad
{
[super viewDidLoad];
self.username.text=[NSString stringWithFormat:@"username is %@", self.u01];
self.passwd.text=self.u02;
}
- (IBAction)logOff:(id)sender {
[[self delegate] logoffViewControllerDone:self username:self.username.text passwd:self.passwd.text];
}
@end
在接口定义中,定义有一个delegate对象,这是用来和源视图控制器交互的。delegate实现了两个对象在松耦合的情况下进行交互。
在方法实现中,增加viewDidLoad方法的功能,显示在源视图控制器中在prepareForSegue:sender:方法里已经设置好属性u01/u02的值。viewDidLoad方法是视图控制器加载视图时执行的方法。一些界面设置工作都在这里完成。
方法logOff:用来实现窗口中logoff按钮的目标的动作。该方法实际上是调用的它的委托也就是源视图控制器中的logoffViewControllerDone:(LogoffViewController *)controller username:(NSString *)username passwd:(NSString *)passwd方法。
在写个程序时,遇到NSUnknownKeyException错误,主要信息如下:
2012-12-20 21:17:08.646 BirdWatching[1609:11303] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<LogoffViewController 0x75efa70> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key userName.'
这个错误发生在prepareForSegue:sender:方法执行结束时。
显然在LogoffViewController视图控制器上没有userName这个属性。这个属性是我之前定义的,后来删除掉了。
在storyboard中,还有连接这个userName属性的outlet。
这个问题在反复删除时会出现,不知道算不算是storyboard的bug。对于我这个初学者而言,折腾了很久。但也学会了XCODE的debug功能,它其实也就是个gdb调试工具。
这个借segue切换视图控制器的操作过程,和UIViewController中的方法presentViewController:animated:completion:和dismissViewControllerAnimated:completion:很类似。怀疑它的内部实现也是用这两个方法来实现的。
分享到:
相关推荐
5. 编写代码切换:如果手动切换,需要实例化目标视图控制器,然后调用`pushViewController:animated:`或`present(_:animated:completion:)`。 四、View Switcher 示例 "View Switcher"很可能是一个包含多个视图控制...
3. **Container View Controller**: 容器视图控制器(Container View Controller)是iOS SDK提供的一种高级视图控制器,它允许你在单一的界面中嵌入多个子控制器。通过容器视图,你可以实现点击或滑动来切换子控制器...
3. 在 segue 或视图控制器的呈现/消失方法中,设置自定义过渡动画。 4. 在`animateTransition:`方法中,编写具体的动画代码,例如改变视图的frame、transform属性,或者使用Core Animation来实现更复杂的动画效果。...
视图控制器之间的切换和导航通常是通过UINavigationController来实现的。UINavigationController是一个容器视图控制器,它维护了一个栈(stack)来保存被导航的视图控制器。当用户进行前进或后退操作时,...
当我们按下“导航栏”上的按钮或调用`pushViewController:animated:`方法时,新的视图控制器会被压入栈顶,同时旧的视图控制器可以通过`popViewControllerAnimated:`方法移出栈,实现前后视图的平滑切换。...
- 页面视图控制器通过数据源协议(UIPageViewControllerDataSource)来获取和设置展示的页面。 - 实现pageViewController(_:viewControllerBefore:)和pageViewController(_:viewControllerAfter:)方法,返回相邻的...
通过导航栏中的“返回”按钮或者编程方式,用户可以前后切换视图控制器。 3. **Storyboard**:是Xcode中用于可视化布局和连接视图控制器的工具,它可以简化视图间的跳转逻辑,通过segue进行视图间切换。 4. **...
- 导航控制器是一种常见的视图控制器容器,它通过一个堆栈管理子视图控制器,并提供了一个可定制的导航栏来显示回退按钮和标题。 - 使用`pushViewController:animated:`方法将新的视图控制器推入导航栈,`...
- 在视图控制器之间切换时,可以通过自定义转场动画来实现更丰富的过渡效果。`UIViewControllerAnimatedTransitioning`协议允许我们自定义转场动画的实现。 - 使用`present(_:animated:completion:)`和`dismiss...
1. **使用UIStoryboardSegue**:UIStoryboardSegue是UIStoryboardSegue类的对象,用于在故事板中连接两个视图控制器并控制它们之间的转场。通过重写`perform`方法,你可以自定义segue的执行过程,包括动画效果。 2....
6. **使用segue**:在Storyboard中,可以通过拖拽 segue 来连接两个视图控制器,实现无缝切换。 7. **堆栈管理**:使用容器视图控制器(如UISplitViewController)或自定义容器来管理视图控制器的堆栈,实现复杂的...
在Storyboard中,可以通过拖拽创建 segue 连接不同的视图控制器,然后重写`prepare(for:sender:)`方法来传递数据。默认的 segue 动画是简单的淡入淡出效果,但可以通过自定义 segue 类来实现自定义动画。 接下来是`...
1. **UIStoryboardSegue**:`UIStoryboardSegue`是视图控制器间切换的基础,通过拖拽连线实现。有多种类型的Segue,例如: - **Show(Push)**:用于Navigation Controller中,将新视图推入栈顶,常见于分栏式布局...
本文将深入探讨“ios应用源码之多种视图切换方式集锦”这个主题,通过2018127版本的源码,我们将学习到iOS中常用的视图控制器间的切换技术。 首先,我们最常见的是`UIStoryboardSegue`,这是Storyboards中的一种...
当满足加载新视图的条件时,我们可以使用Storyboard中的segue或者手动创建新的视图控制器来实现视图的切换。例如,如果使用UIStoryboardSegue,可以在`handlePanGesture(_:)`中调用`performSegue(withIdentifier:...
通过调用`pushViewController:animated:`方法可以实现前后视图控制器的切换。 2. **模态展示(Present Modally)**:当需要临时显示一个新的界面时,可以使用模态展示。调用`present(_:animated:completion:)`方法...
7. **Storyboard Segues(故事板segue)**:在故事板中,通过拖拽segue来连接视图控制器,可以实现简单的视图切换,同时支持不同的Segue类型,如push、modal、unwind等。 源码集锦可能涵盖了以上部分或全部视图切换...
4. **视图控制器间的通信(UIViewController Communication)**:在切换视图的过程中,视图控制器之间的数据传递和状态管理是非常重要的。这通常通过代理模式、通知、闭包或者使用`Storyboard`中的segue来实现。 5....
4. **Storyboard**:在iOS开发中,Storyboard是一种可视化布局工具,允许开发者通过图形界面设计UI和定义视图控制器之间的转换。在这个源码中,可能包含了不同的Storyboard场景来展示各种视图切换效果。 5. **Segue...
通过pushViewController:animated:方法,可以将新的视图控制器压入栈顶,实现平滑的过渡效果,用户还可以通过popViewControllerAnimated:方法返回到上一个视图。 2. **UITabBarController**:它是实现底部标签栏...