在使用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:很类似。怀疑它的内部实现也是用这两个方法来实现的。
分享到:
相关推荐
Ios-Segue:在视图控制器之间传递数据
使用 segue 进行控制器间的数据传输-示例
我设法使自定义容器视图控制器与其子视图控制器的建立关系看起来像苹果公司的UINavigtaionController或UITabbarController在情节提要中一样。 示例文件夹中有两个示例: 侧菜单 此示例使用RESideMenu作为自定义...
这个项目演示了如何使用 segue 的子类来初始化自定义父控制器的子控制器。 实施步骤 在故事板中,使用 DATOutletSegue 将父控制器连接到子控制器。 将每个 segue 的标识符设置为子控制器也应该连接的属性名称 在...
AFBlurSegue 现在支持iOS 8实时模糊和旋转 AFBlurSegue是UIStoryboardSegue的自定义实现,它将自动模糊模态视图控制器的背景。... 如果必须创建序列,请通过从初始视图控制器到目标视图控制器的右键单击来创建
“如何在Swift 2.0中的iOS 9视图之间传递数据”视频演示了如何将数据直接传递到目标视图控制器,以及如何使用协议将数据传递回源视图控制器。 该视频使用Swift 2.0和iOS 9 您可以上找到更多iOS视频入门该代码是一个...
SegueContext 您可以轻松地将上下文传递给目标视图控制器。 这是Swift的新版本!您现在对视图控制器转换没有任何抱怨吗? 紧耦合! 麻烦了...这是一个麻烦的代码... self . performSegue ( withIdentifier : " Next ...
您只需要将一个视图控制器(称为A)场景拖到故事板中,将其类设置为ZZStoryboardReference,将内容视图替换为标签,然后将标签的文本设置为另一个可以从故事板实例化的视图控制器(称为B)的名称。 (我建议在演示...
通过在第一个视图控制器和第二个视图控制器之间进行控制+拖动,可以在第一个视图控制器和第二个视图控制器之间进行选择。 单击您创建的序列,并在属性检查器中为其指定一个标识符。 在第一个视图控制器上创建一个...
应用程序应用程序详细信息:这是UI设计的一个示例,它在视图控制器之间传递数据,并使用storbyboard,segue,导航控制器概念进行导航。 在Objective-C,Swift和SwiftUI中创建示例应用程序,演示以下概念使用情节提要...
SegueColorSample 与“了解 Segue 中的‘发送者’并使用它来将数据传递给另一个视图控制器”博客文章一起使用的示例代码。
1 步:在视图控制器上添加Container View 第 2 步:将一个或多个子view controller添加到Container View ,segue 类型为empty 第 3 步:设置转场 ID 第四步:设置Container View和多个子View view controller绑定...
您可以使用UIStoryboardSegue将对象传递给目标视图控制器。您现在对视图控制器转换没有任何抱怨吗? # import " NextViewController.h "# import " ModalViewController.h "- ( void )prepareForSegue:...
查看控制器SwiftMessages可以使用SwiftMessagesSegue自定义模式segue呈现视图控制器! 是的子类, UIStoryboardSegue作为自定义模式UIStoryboardSegue直接集成到Interface Builder中,使视图控制器可以利用...
ios 使用 故事板模式下的 segue 进行导航
用法呈现带转场使用带有 segue 的 CCMPopup 的第一步就像单击和拖动一样简单: 第二步是在源控制器中导入 CCMPopupSegue: #import <CCMPopup> 然后你必须实现源控制器的prepareForSegue:sender:方法,并将 segue ...
使用storyboard 的segue 从后向前进行传值
使用SegueManager可以很容易地以编程方式执行segue和更新目标视图控制器。 下面的示例演示如何执行segue和设置视图模型: segueManager. performSegue ( withIdentifier : " showDetails " ) { ( details : ...
ios segue 实验源码
(也与导航控制器堆栈外的视图控制器兼容) 主要基于提供的。 用法 代码中的用法与任何其他 segue 相同。 要与故事板一起使用, 如有必要,将一个新的视图控制器拖到故事板中。 像往常一样按住 Control 拖动以...