असंगत प्रकार 'ViewController * const_strong' से 'id <Delegate>' को असाइन करना


84

अपने ऐप के दौरान, मैं सेट होने पर सिमेंटिक इश्यू चेतावनी प्राप्त कर रहा हूं ViewController.delegate = self। मैंने ऐसे ही पोस्ट खोजे और पाए हैं लेकिन कोई भी मेरी समस्या का समाधान नहीं कर पाया।

ViewController.m:

GameAddViewController *gameAddViewContoller = [[navigationController viewControllers] objectAtIndex:0];
gameAddViewContoller.delegate=self;

सेटिंग करते समय मुझे त्रुटि संदेश मिलता है .delegate=self

GameAddViewController.h:

@protocol GameAddViewControllerDelegate <NSObject>

- (void)gameAddViewControllerDidCancel:(GameAddViewController *)controller;
- (void)gameAddViewController:(GameAddViewController *)controller didAddGame:(Game *) game;

@end

@interface GameAddViewController : UITableViewController <GameAddViewControllerDelegate>
{
sqlite3         *pitchcountDB;
NSString        *dbPath;
}
@property (nonatomic, strong) id <GameAddViewControllerDelegate> delegate;
...
@end

ViewController.h:

#import "GameAddViewController.h"

@class ViewController;
@protocol ViewControllerDelegate <NSObject>
- (void)ViewControllerDidCancel:(ViewController *)controller;

@end
@interface ViewController : UIViewController <ViewControllerDelegate>
-(void) checkAndCreateFile;
@end

क्या कोई मुझे चेतावनी संदेशों को हल करने के लिए सही दिशा में इंगित कर सकता है?

जवाबों:


80

इस लाइन पर:

gameAddViewContoller.delegate=self; 

ध्यान दें कि स्व उस प्रकार का है ViewControllerजो GameAddViewControllerप्रोटोकॉल के अनुरूप नहीं है।


1
इसे ठीक करने के लिए मुझे क्या करना चाहिए। क्या मुझे GameAddViewController प्रोटोकॉल में कुछ बदलने की आवश्यकता है?
डेविड एल

2
तो जैसा कि @borrrden ने सुझाव दिया है। प्रतिनिधि ViewControllerको सूचित करें GameAddViewControllerDelegate
जियोरास्क

35
ठीक है, तो मैं आखिरकार मिल गया। मैंने इसे अपनी हेडर फ़ाइल // # इंपोर्ट "GameAddViewController.h" @interface ViewController: UIViewController <GameAddViewControllerDelegate> @ end //
David L

2
या, यह इसी तरह की समस्याओं वाले अन्य लोगों की मदद कर सकता है: @interface myViewControllerName: UIViewController <MCSessionDelegate>
कस्टम

2
इसे कैसे स्वीकार किया गया और 72 वोट मिले? यह जवाब सिर्फ XCode की चेतावनी को फिर से बताता है और कोई समाधान नहीं देता है।
19

64

मेरे लिए जो हो रहा था, वह यह है कि मैं अपने हेडर फ़ाइल पर @interface में प्रतिनिधि नहीं जोड़ रहा था

उदाहरण के लिए

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end

12

आप <GameAddViewControllerDelegate> को गलत स्थान पर रख रहे हैं। यह GameAddViewController पर नहीं जाता है, यह ViewController पर जाता है।


3

यह उन अन्य लोगों की मदद कर सकता है जो मल्टीप्कर कनेक्टिविटी को सीधे व्यूकंट्रोलर में जोड़ रहे हैं। MyViewControllerName.h के शीर्ष पर '<MCSessionDelegate>' जोड़ें

@interface myViewControllerName : UIViewController<MCSessionDelegate>

1

इसके अलावा, यदि आप xx.m पर अपने प्रतिनिधि को परिभाषित करते हैं, लेकिन आप इसे अन्य कक्षा में उपयोग करते हैं। आपको यह समस्या हो सकती है। इसलिए, जब जरूरत हो, xx.h पर सिर्फ प्रोटोकॉल डिफाइन करें।


1

यदि आपके पास एक हाइब्रिड प्रोजेक्ट है, स्विफ्ट में प्रोटोकॉल और ऑब्जेक्टिव-सी में असाइनमेंट:

स्विफ्ट घोषणा:

protocol BackgroundTasking {
    func beginTask(withName: String, expirationHandler handler: (()->Void)?)
    func endTask(withName: String)
}

उद्देश्य-सी असाइनमेंट:

@property (nonatomic) id<BackgroundTasking> backgroundTasker;

_backgroundTasker = [[BackgroundTasker alloc] init]; // WARNING

असंगत प्रकार 'BackgroundTasker *' से '__strong id' को असाइन करना

आपको @objc के रूप में वर्ग (इस चेतावनी को हटाने के लिए) और कार्यों (उन्हें सुलभ बनाने के लिए) को घोषित करने की आवश्यकता है सही ढंग से पाटने के है।

सही स्विफ्ट घोषणा:

@objc protocol BackgroundTasking {
    @objc func beginTask(withName: String, expirationHandler handler: (()->Void)?)
    @objc func endTask(withName: String)
}

0

हाइब्रिड परियोजनाओं पर आपको .m फ़ाइल के बजाय .h फ़ाइल पर अपने प्रतिनिधियों को जोड़ना चाहिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.