Вам не хватает основ. Я не думаю, что вам нужны делегаты для выполнения этой задачи, но мы идем.
Протокол похож на контракт. В вашем классе FlipsideViewController
вы определили протокол, который, по сути, утверждает, что если вы соответствуете этому протоколу, то вы должны реализовать этот метод.
Как вы соответствуете протоколу?
В MainViewController
@interface
будет выглядеть примерно так
@interface MainViewController : UIViewController <FlipsideViewControllerDelegate>
Тот факт, что у вас есть протокол, написанный в угловых скобках, означает, что вы обещаете соблюдать протокол и, следовательно, должны реализовать
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller;
в вашем MainViewController.m
.
Теперь, когда MainNavigationController
устанавливает себя в качестве делегата (controller.delegate = self;
), он завершает ссылку. Это позволяет FlipsideViewController
звонить
[delegate flipsideViewControllerDidFinish:self];
который будет вызывать метод, определенный в MainViewController
, который отклоняет модальный контроллер вида.
Вы определили второй протокол (вы могли бы добавить метод к первому, и тогда вам не пришлось бы принимать два протокола), и, как другие отметили, вы не связали классы, выполнив
controller.delegate2 = self;
Это не решит вашу проблему. Вам все равно нужно будет соответствовать ChartDelegate
, добавив его в декларацию. Как только вы это сделаете, вы все равно не выйдете из воды, потому что метод неправильный.
Полное решение - не использовать делегатов, поскольку они здесь на самом деле не нужны
MainViewController.h
@interface MainViewController : UIViewController <FlipsideViewControllerDelegate>
- (IBAction)showInfo:(id)sender;
@end
MainViewController.m
@implementation MainViewController
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller
{
[self dismissModalViewControllerAnimated:YES];
}
- (IBAction)showInfo:(id)sender
{
FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideView" bundle:nil];
controller.delegate = self;
/*
* The labelText property is defined in the header for FlipsideViewController
* In this case this is the easiest way to get data from this controller to
* the controller we are about to display
*/
controller.labelText = @"WHAT EVER YOU WANT TO SEND"; // <---- sending data
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];
[controller release];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
FlipsideViewController.h
@class FlipsideViewController;
@protocol FlipsideViewControllerDelegate
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller;
@end
@interface FlipsideViewController : UIViewController
/*
* These properties have been added. The label is used for displaying the text
* and needs to be hooked up in Interface builder
*
* The NSString is the property that is holding the data passed from MainViewController
*/
@property (nonatomic, retain) IBOutlet UILabel *testLabel;
@property (nonatomic, copy) NSString *labelText; from MainViewControlller
@property (nonatomic, assign) id <FlipsideViewControllerDelegate> delegate;
- (IBAction)done:(id)sender;
@end
FlipsideViewController.m
@implementation FlipsideViewController
@synthesize delegate = _delegate;
/*
* We need to synthesise out properties so we get our getters and setters created
*/
@synthesize testLabel = _testLabel;
@synthesize labelText = _labelText;
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
/*
* This is called once the view is set up and all connections have been made in
* interface builder. Therefore we can now set the text of our test label
*/
self.testLabel.text = labelText;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark - Actions
- (IBAction)done:(id)sender
{
[self.delegate flipsideViewControllerDidFinish:self];
}
- (void)dealloc
{
/*
* Memory management for the ivars we added
*/
[_testLabel release];
[_labelText release];
[super dealloc];
}
@end