【发布时间】:2014-02-25 17:25:34
【问题描述】:
我目前正试图更好地理解控制器之间传递数据的机制是如何工作的,我有点困惑,尤其是当将数据从第二个视图控制器传递回主视图控制器时强>。
这是我有的,但不完全理解。我有两个视图控制器,在第一个中,我有一个按钮,当单击它时,它基本上会转到第二个视图控制器和一个显示从第二个视图控制器发送的消息的标签。在第二个视图控制器中,我有一个按钮和一个文本字段,该按钮基本上将文本字段中的任何内容发送到主视图控制器中的标签。
这里是代码...
// FirstVC.h
#import <UIKit/UIKit.h>
#import "SecondVC.h"
@interface FirstVC : UIViewController <passNames>
@property (nonatomic, strong) NSString* firstNameString;
@property (weak, nonatomic) IBOutlet UILabel *firstNameLabel;
@end
//FirstVC.m
#import "FirstVC.h"
@implementation FirstVC
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier]isEqualToString:@"secondController"])
{
UINavigationController *navController = segue.destinationViewController;
SecondVC *vc2 = (SecondVC*)navController.topViewController;
[vc2 setDelegate:self];
}
}
-(void)viewWillAppear:(BOOL)animated
{
self.firstNameLabel.text = _firstNameString;
}
-(void)setFirstName:(NSString *)firstName
{
_firstNameString = firstName;
}
@end
//SecondVC.h
#import <UIKit/UIKit.h>
@protocol passNames <NSObject>
-(void)setFirstName:(NSString*)firstName;
@end
@interface SecondVC : UIViewController
@property (retain)id <passNames> delegate;
- (IBAction)send:(UIBarButtonItem *)sender;
@property (nonatomic, strong) NSString *firstNameString;
@property (weak, nonatomic) IBOutlet UITextField *firstNameText;
@end
//SecondVC.m
#import "SecondVC.h"
#import "FirstVC.h"
@interface SecondVC ()
@end
@implementation SecondVC
- (IBAction)send:(UIBarButtonItem *)sender
{
_firstNameString = _firstNameText.text;
[[self delegate]setFirstName:_firstNameString];
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
谁能解释一下prepareForSegue方法在上面的代码中是如何工作的?这个问题的原因是因为我添加了一个 NSLog 并且看起来这个方法只在从主视图控制器到第二个控制器的转换中被调用。如果在从第二个视图控制器转换到主视图控制器时不调用此方法,为什么需要此方法,在我的情况下,这就是我正在做的事情?在将数据从主视图控制器传递到第二个控制器时使用它是有意义的,而不是上面显示的情况。
可以解释一下将数据传回主视图控制器时的整个机制吗?
仅供参考,我确实了解协议和授权。
非常感谢。
【问题讨论】:
标签: ios objective-c uiviewcontroller delegation