বেমানান টাইপ 'ভিউকন্ট্রোলার * কনস্ট_স্ট্রং' থেকে 'আইডি <ডেলিগেট>' এ নিয়োগ দেওয়া হচ্ছে


84

আমার অ্যাপ্লিকেশন জুড়ে, আমি সেট করার সময় আমি শব্দার্থ সংক্রান্ত সমস্যার সতর্কতা পাচ্ছি ViewController.delegate = self। আমি অনুরূপ পোস্টগুলি সন্ধান করেছি এবং খুঁজে পেয়েছি তবে কেউই আমার সমস্যার সমাধান করতে সক্ষম হয়নি।

ViewController.m:

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

সেট করার সময় আমি ত্রুটি বার্তাটি পাই .delegate=self

গেমএডভিউকন্ট্রোল.আর:

@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প্রোটোকলের সাথে খাপ খায় না ।


4
এটি ঠিক করার জন্য আমার কী করা দরকার। গেমএডভিউকন্ট্রোলার প্রোটোকলে আমার কিছু পরিবর্তন করার দরকার আছে?
ডেভিড এল

4
@ বারর্ডেনের পরামর্শ অনুসারে কাজ করুন। প্রতিনিধিটির ViewControllerকাছে রূপান্তর করুন GameAddViewControllerDelegate
giorashc

35
ঠিক আছে, তাই আমি অবশেষে এটি পেয়েছি। UIViewController <GameAddViewControllerDelegate> @ শেষ //: আমি কি আমার হেডার ফাইল // # আমদানি "GameAddViewController.h" @interface ViewController এটিকে জুড়েছে
ডেভিড এল

4
অথবা, এই শক্তি সাহায্যের অনুরূপ সমস্যার সঙ্গে অন্যান্য ব্যক্তিদের: @interface myViewControllerName: UIViewController <MCSessionDelegate>
কাস্টম Bonbons

4
এটি কীভাবে গৃহীত হবে এবং 72২ টি ভোট পেয়েছে? এই উত্তরটি এক্সকোডের সতর্কবার্তাটির পুনরাবৃত্তি করে এবং কোনও সমাধান দেয় না।
সরলজ

63

আমার কাছে যা ঘটেছিল তা হ'ল আমি আমার শিরোলেখের ফাইলটিতে @ ইন্টারফেসে প্রতিনিধিটি যোগ করছিলাম না

উদাহরণ স্বরূপ

@interface TheNameOfYourClass : UIViewController <TheDelegatorClassDelegate>

@end

12

আপনি <গেমএডডভিউ কনট্রোলারডেলিগেট> ভুল জায়গায় রেখে দিচ্ছেন। এটি গেমএডভিউকন্ট্রোলার যায় না, এটি ভিউকন্ট্রোলারে যায়।


4

এটি অন্য ব্যক্তিকে সহায়তা করতে পারে যারা সরাসরি ভিউকন্ট্রোলারে মাল্টিপিয়র সংযোগ যুক্ত করে। মাইভিউকন্ট্রোলারনামের শীর্ষে '<এমসিএসশনডিলেগেট>' যুক্ত করুন:

@interface myViewControllerName : UIViewController<MCSessionDelegate>

1

এছাড়াও, যদি আপনি xx.m এ আপনার প্রতিনিধি নির্ধারণ করেন তবে আপনি এটি অন্য শ্রেণিতে ব্যবহার করেন use আপনি এই সমস্যা পেতে পারেন। সুতরাং, প্রোটোকল কেবল 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

অসঙ্গত প্রকারের 'ব্যাকগ্রাউন্ড টাস্কার *' থেকে '__ স্ট্রং আইডি' অর্পণ করা হচ্ছে

তাদের সঠিকভাবে ব্রিজ হওয়ার জন্য আপনাকে ক্লাসটি (এই সতর্কতাটি সরাতে) এবং ফাংশনগুলি (তাদের অ্যাক্সেসযোগ্য করার জন্য) হিসাবে ঘোষণা করতে হবে ob

সঠিক সুইফ্ট ঘোষণা:

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

0

হাইব্রিড প্রকল্পে আপনার প্রতিনিধিদের .m ফাইলের পরিবর্তে .h ফাইলে যুক্ত করা উচিত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.