В настоящее время я пытаюсь лучше понять, как работают механизмы передачи данных между контроллерами, и я немного запутался, особенно когда данные возвращаются из второго контроллера представления в контроллер основного вида.Понимание механизма при передаче данных с контроллера второго представления на главный контроллер представления
Это то, что у меня есть, но не совсем понятно. У меня есть два контроллера вида, в первом случае у меня есть кнопка, которая при нажатии на нее в основном переходит к второму контроллеру представления и метке, которая показывает сообщение, отправленное со второго контроллера представления. Во втором контроллере представления у меня есть кнопка и текстовый фильтр, кнопка в основном отправляет все, что находится в текстовом поле, на метку в главном контроллере.
Вот код ...
// 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 и похоже, что этот метод вызывается только при переходе от главного контроллера представления ко второму контроллеру. Почему нужен этот метод, если он не вызывается при переходе от контроллера второго представления к контроллеру главного представления, который в моем случае является тем, что я делаю? Имеет смысл использовать его при передаче данных с главного контроллера представления на второй контроллер, а не на случай, показанный выше.
Может ли кто-нибудь объяснить весь механизм при передаче данных обратно на главный контроллер?
FYI, я действительно разбираюсь в протоколах и делегировании.
Большое спасибо.
И посмотреть обсуждение в моей книге: http://www.apeth.com/iOSBook/ch10.html#_protocols – matt
На самом деле у меня есть копия вашей книги. Программирование iOS 5. Очень хорошая книга! Большое спасибо. –
Объяснение этого момента (и многих других) в новой редакции (версия iOS 7), к сожалению, гораздо лучше объясняет ...! – matt