I am new to Objective C and trying to grasp the concept of a delegate. I have the following code and have made comments where a warning and an error occur with the build.I am using the latest version of Xcode and using a Storyboard.
From MainViewController.h
#import <UIKit/UIKit.h>
#import "FinalViewController.h"
@class MainViewController;
@protocol MainViewControllerDelegate <NSObject>
- (void)sayHello;
@end
@interface MainViewController : UIViewController
@property (nonatomic, strong) id <MainViewControllerDelegate> delegate;
- (void)writeToMe;
. . .
@end
From MainViewController.m
#import "MainViewController.h"
#import "FinalViewController.h"
@interface MainViewController ()
@end
@implementation MainViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)writeToMe
{
[self.delegate sayHello];
}
. . .
@end
From FinalViewController.h
#import <UIKit/UIKit.h>
#import "MainViewController.h"
@interface FinalViewController : UIViewController <NSCoding, MainViewController> //The ERROR below appears
//ERROR:Cannot find protocol declaration for ‘MainViewControllerDelegate’; did you mean ‘UIPageViewControllerDelegate’?
. . .
@end
From FinalViewController.m
#import "FinalViewController.h"
@interface FinalViewController ()
@end
@implementation FinalViewController
- (void)viewDidLoad
{
[super viewDidLoad];
MainViewController *mainVC;
mainVC.delegate = self; //causes WARNING below
//WARNING:Assigning to ‘id <MainViewControllerDelegate> from incompatible type ‘FinalViewController *const__strong’
[mainVC writeToMe];
. . .
}
- (void)sayHello
{
NSLog(@"sayHello called");
}
@end
I have researched problems and responses to a similar problem on this web site, but have not found a solution using Storyboard.
Change:
#import "MainViewController.h"
#import "FinalViewController.h"
@interface MainViewController ()
@end
@implementation MainViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)writeToMe
{
[self.delegate sayHello];
}
. . .
TO:
#import "MainViewController.h"
@interface MainViewController ()
@end
@implementation MainViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)writeToMe
{
[self.delegate sayHello];
}
. . .
ALSO:
#import <UIKit/UIKit.h>
#import "FinalViewController.h"
@class MainViewController;
@protocol MainViewControllerDelegate <NSObject>
- (void)sayHello;
@end
@interface MainViewController : UIViewController
@property (nonatomic, strong) id <MainViewControllerDelegate> delegate;
- (void)writeToMe;
. . .
@end
TO
#import <UIKit/UIKit.h>
@protocol MainViewControllerDelegate <NSObject>
- (void)sayHello;
@end
@interface MainViewController : UIViewController
@property (nonatomic, weak) id <MainViewControllerDelegate> delegate;
- (void)writeToMe;
. . .
@end
--------------------------- EDIT ------------------------------------
Change
@interface FinalViewController : UIViewController <NSCoding, MainViewController>
to
@interface FinalViewController : UIViewController <NSCoding, MainViewControllerDelegate>
This might be a typo but:
@interface FinalViewController : UIViewController <NSCoding, MainViewController>
should be:
@interface FinalViewController : UIViewController <NSCoding, MainViewControllerDelegate>
Also remove the import of "FinalViewController.h"
from MainViewController.h
.
And your other warning can be fixed by changing:
@interface FinalViewController ()
to:
@interface FinalViewController () < MFMailComposeViewControllerDelegate>
and change:
mainVC.delegate = self;
to:
mainVC.mailComposeDelegate = self;
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.