【iOS功能实现】通过segue切换视图控制器

在使用storyboard开发iOS应用时,从一个视图控制器的视图中点击一个按钮跳转到另外一个视图控制器的视图的操作开始使用segue实现。storyboard较之以前的nib最大的优点就是很直观地、图形化地展示各个视图控制器之间的关系。这个关系就是通过segue来实现。
通过segue,可以将一个视图控制器的数据传输到跳转到的另一个视图控制器上,再通过delegate是释放这个视图控制器并将新的数据传回来。这个segue的类型一般设置为modal。

第一个视图控制器LoginViewController,用来显示登录窗口。它的视图中有两个textfield,用于录入用户名和密码,一个button,点击该button,通过拖到目标视图控制器上的segue来实现视图切换。

它的代码如下:
  1. #import <UIKit/UIKit.h>

  2. @interface LoginViewController : UIViewController <UITextFieldDelegate>
  3. @property (weak, nonatomic) IBOutlet UITextField *usernameInput;
  4. @property (weak, nonatomic) IBOutlet UITextField *passwdInput;
  5. @end

  6. #import "LoginViewController.h"
  7. #import "LogoffViewController.h"

  8. @interface LoginViewController () <LogoffViewControllerDelegate>

  9. @end

  10. @implementation LoginViewController
  11. @synthesize usernameInput=_usernameInput,passwdInput=_passwdInput;

  12. - (void)viewDidLoad
  13. {
  14.     [super viewDidLoad];
  15.     // Do any additional setup after loading the view.
  16. }

  17. -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  18. {
  19.     if ([[segue identifier] isEqualToString:@"LogoffView"]) {
  20.         LogoffViewController * logoffController=[segue destinationViewController];
  21.         logoffController.u01=self.usernameInput.text;
  22.         logoffController.u02=self.passwdInput.text;
  23.         logoffController.delegate=self;
  24.     }
  25. }

  26. -(void)logoffViewControllerDone:(LogoffViewController *)controller username:(NSString *)username passwd:(NSString *)passwd
  27. {
  28.     [self dismissViewControllerAnimated:YES completion:NULL];
  29.     NSLog(@"username is %@",username);
  30. }

  31. - (BOOL)textFieldShouldReturn:(UITextField *)textField {
  32.     if ((textField == self.usernameInput) || (textField == self.passwdInput)) {
  33.         [textField resignFirstResponder];
  34.     }
  35.     return YES;
  36. }

  37. @end
复制代码
在prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender方法中,实现目标视图控制器属性的设置,实际上是将数据传输到目标视图控制器上,并设置目标视图控制器的委托为自己。
这样通过这个委托可以再切换回来。

在logoffViewControllerDone:(LogoffViewController *)controller username:(NSString *)username passwd:(NSString *)passwd方法中,实现目标控制器的委托的方法。

它会被目标视图控制器调用,将目标视图控制器的数据传过来,并释放目标视图控制器。


第二个视图控制器LogoffViewController,用来显示前一个视图控制器的切换窗口,有两个lable用来显示传输过来的用户名和密码信息,一个button用来释放自己,并回到前一个视图控制器窗口。
  1. #import <UIKit/UIKit.h>

  2. @protocol LogoffViewControllerDelegate;

  3. @interface LogoffViewController : UIViewController 
  4. @property (strong,nonatomic) NSString *u01,*u02;
  5. @property (weak, nonatomic) IBOutlet UILabel *username;
  6. @property (weak, nonatomic) IBOutlet UILabel *passwd;
  7. @property (weak,nonatomic) id <LogoffViewControllerDelegate> delegate;
  8. - (IBAction)logOff:(id)sender;
  9. @end

  10. @protocol LogoffViewControllerDelegate <NSObject>
  11. -(void)logoffViewControllerDone:(LogoffViewController *)controller username:(NSString *)username passwd:(NSString *)passwd;
  12. @end


  13. #import "LogoffViewController.h"

  14. @implementation LogoffViewController
  15. @synthesize u01=_u01,u02=_u02;
  16. @synthesize delegate=_delegate;
  17. @synthesize username=_username,passwd=_passwd;

  18. - (void)viewDidLoad
  19. {
  20.     [super viewDidLoad];
  21.     self.username.text=[NSString stringWithFormat:@"username is %@", self.u01];
  22.     self.passwd.text=self.u02;
  23. }

  24. - (IBAction)logOff:(id)sender {
  25.     [[self delegate] logoffViewControllerDone:self username:self.username.text passwd:self.passwd.text];
  26. }
  27. @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:很类似。怀疑它的内部实现也是用这两个方法来实现的。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值