1

iOSアプリでFacebook v4 SDKを使用しています。関連情報を得るために、私はよくシングルトン[FBSDKProfile currentProfile]を使います。しかし、私はまた、簡単にアクセスできるようにプロファイル画像を必要とするので、これを取るカテゴリを書いた。認識できないセレクタがFBSDKProfileカテゴリのインスタンスに送信されました

これは、ヘッダファイルされる:

#import "FBSDKProfile+ProfileImage.h" 

@interface FBSDKProfile() 

@property (nonatomic, strong, readwrite) UIImage *profileImage; 

@end 

@implementation FBSDKProfile (ProfileImage) 

+(void)fetchProfileImageWithBlock:(void (^)(BOOL succeeded))handler { 
    FBSDKProfile *currentProfile = [FBSDKProfile currentProfile]; 
    NSString *userId = currentProfile.userID; 
    if (![userId isEqualToString:@""] && userId != Nil) 
    { 
     [self downloadFacebookProfileImageWithId:userId completionBlock:^(BOOL succeeded, UIImage *profileImage) { 
      currentProfile.profileImage = profileImage; 
      if (handler) { handler(succeeded); } 
     }]; 
    } else 
    { 
     /* no user id */ 
     if (handler) { handler(NO); } 
    } 
} 

+(void)downloadFacebookProfileImageWithId:(NSString *)profileId completionBlock:(void (^)(BOOL succeeded, UIImage *profileImage))completionBlock 
{ 
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large", profileId]]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    [NSURLConnection sendAsynchronousRequest:request 
            queue:[NSOperationQueue mainQueue] 
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
           if (!error) 
           { 
            UIImage *image = [[UIImage alloc] initWithData:data]; 
            completionBlock(YES, image); 
           } else{ 
            completionBlock(NO, nil); 
           } 
          }]; 
} 

@end 

しかし、私はこの例外を取得しています:キャッチされない例外が原因

終端アプリ「ここで実装ファイルが

#import <FBSDKCoreKit/FBSDKCoreKit.h> 

@interface FBSDKProfile (ProfileImage) 

+(void)fetchProfileImageWithBlock:(void (^)(BOOL succeeded))handler; 

@property (nonatomic, strong, readonly) UIImage *profileImage; 

@end 

ですNSInvalidArgumentException '、理由:' - [FBSDKProfile setProfileImage:]:インスタンスに送信された認識できないセレクタ

なぜですか?あなたが使用することができます

+0

readonly属性を割り当てないでください。 – Lion

+0

プロパティは、カテゴリ内で自動合成されません。独自のゲッターとセッターを作成し、イメージ用に独自のストレージを用意する必要があります。 – dan

+0

@ダンあなたはこれを詳しく教えていただけますか?合成しようとすると、このエラーが表示されます:** @カテゴリの実装では合成できません** – Erik

答えて

0

問題

あなたはあなたの財産profileImageに属性readonlyを追加しました。 意味:

を読むことができるので、セッターを呼び出すと例外がスローされます。

ソリューション

は、私は、ダウンロードが完了する前に画像を設定していると思うprofileImage

@property (nonatomic, strong) UIImage *profileImage; 
+0

ありがとうございます。私はシングルトンではなく "普通の"クラスのインスタンスであれば可能だった 'self.profileImage = profileImage'の代わりに' [FBSDKProfile currentProfile] .profileImage = profileImage; 'を使用していますか? – Erik

+0

プロパティがデフォルトであるため、実際に明示的に指定する必要のない 'readwrite'があった場合には動作します – meda

+0

' readonly'属性を削除しましたが、それと同じ例外が表示されます。 「プロパティ 'profileImage'はメソッド 'profileImage'が定義されることを要求します - @動的を使用するか、このカテゴリにメソッド実装を提供します"。エラーを表示するので '@ synthesize'を行うことはできません。あなたはsetter/getterをどうやって作りますか? – Erik

0

FBSDKProfilePictureView *profilePictureview = [[FBSDKProfilePictureView alloc]initWithFrame:_imageView.frame]; 
[profilePictureview setProfileID:result[@"id"]]; 
[self.view addSubview:profilePictureview]; 

は詳細についてはthis linkを参照してください。

関連する問題