简体   繁体   中英

Objective C - Unrecognized delegate

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM