Проект ARC с ссылкой на делегат не компилируется - PullRequest
1 голос
/ 23 марта 2012

У меня проблемы с реализацией SDK Facebook в проекте iOS, и я подозреваю, что виновата эта строка:

[facebook authorize:permissions delegate:self];

Когда я пытаюсь запустить его в своем проекте ARC, он не позволитделегат: самому остаться.Вместо этого он говорит, что есть «Ошибка ARC: нет видимого @interface для« Facebook »объявляет селектор» authorize: Delegate: '"

Я могу скомпилировать с этим:

[facebook authorize:permissions];

, ноЯ не думаю, что Facebook и приложение общаются должным образом.Я могу войти в систему, но после перенаправления обратно в мое приложение не регистрирует, что оно вошло в систему, и не может выполнить ни одну из своих функций совместного использования.

Я думаю, что мне нужно поддерживать эту страницу какARC включен, поэтому установка флага -fno-objc-arc не разрешит эту проблему.

Есть мысли?


СЛЕДУЕТ ЗА 4/5/12:

Мне удалось успешно реализовать Facebook ... но с помощью всплывающего метода входа в приложение.Вот как я это сделал (только аспекты FB):

Мой заголовок делегата приложения:

#import "FBConnect.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>{

    Facebook *facebook;

}

@property (nonatomic, strong) Facebook *facebook;

@end

Включен метод делегата приложения:

////FB ELEMENT: IMPORTING VC TO CONNECT WITH FACEBOOK
#import "ViewController.h"

////FB ELEMENT
@synthesize facebook;

///////FB ELEMENTS
// THIS METHOD SUPPORTS IOS PRE 4.2
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{

    NSLog(@"handleOpenURL called.");

    return [facebook handleOpenURL:url];

}

// THIS METHOD SUPPORTS IOS AFTER 4.2
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{

NSLog(@"openURL called.");

return [facebook handleOpenURL:url];
}

Тогда яхотел, чтобы большая часть активности Facebook была на странице, которая его назвала.Вот заголовок:

#import "FBConnect.h"

@interface ViewController : UIViewController <FBSessionDelegate, FBDialogDelegate>

//FB ELEMENTS
Facebook *facebook;
BOOL login;

//////SHARE PROPERTIES FOR PHOTO DISPLAY LAYER
@property (nonatomic, strong) Facebook *facebook;

И на методе контроллера представления:

@synthesize facebook;

////////////////////////////////////////////

-(void)postWall{

    NSLog(@"postWall called.");

    //CREATING MORE ACCESSIBLE VARIABLE
    NSString *photoTitle = [photoTitles objectAtIndex:pt];


    //ESTABLISHES DESCRIPTION CONTENT
    NSDictionary *itemDescriptionPre = [photoDescriptions objectAtIndex:pt];
    NSString *itemDescription = [itemDescriptionPre objectForKey:@"_content"];

    NSMutableDictionary *paramsSet = 
    [NSMutableDictionary dictionaryWithObjectsAndKeys:

     //CLICKABLE LINK COMPONENT (STORY TITLE WORKS WELL HERE)
     photoTitle, @"name",

     //STORY DESCRIPTION GOES HERE
     itemDescription, @"description",

     //STORY LINK GOES HERE
     [flickrURLLink objectAtIndex:pt], @"link",

     //PHOTO TO CONNECT WITH POST
     [photoURLsLargeImage objectAtIndex:pt], @"picture",
     nil];  

    [[self facebook] dialog:@"feed" andParams:paramsSet andDelegate:self];

}

- (void) fbDidLogin {

    facebook = [[Facebook alloc] initWithAppId:@"MY_APP_ID" andDelegate:self];

    login = YES;

    NSLog(@"Logged in with Facebook credentials");

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationKey"];
    [defaults synchronize];

    [self postWall];
}

- (void)fbDidNotLogin:(BOOL)cancelled{
    ///TO COMPLETE
}

- (void)fbDidExtendToken:(NSString*)accessToken
               expiresAt:(NSDate*)expiresAt{
    ////TO COMPLETE
}


- (void)fbDidLogout{

    login = NO;
    NSLog(@"Logged out with Facebook credentials");
}

- (void)fbSessionInvalidated{

    login = NO;

    NSLog(@"Logged out with Facebook credentials");
}

После настройки я убедился, что добавил идентификатор приложения в список, как описано вУчебник Facebook и все работало как положено.

Я знаю, что значение входа в систему BOOL еще ни на что не влияет.

Моя текущая проблема с этим кодом - проблема совместимости до 5.1.

Отлично работает в моем тестовом устройстве и симуляторе 5.1, но ничего не делает после шага входа, если я перехожу на 5.0 или ниже.Есть идеи, почему это так?Я могу ввести свои данные для входа в систему, затем вернуться в приложение, но больше вариантов не отображается.

Спасибо за ваши отзывы.Хотелось бы услышать ваши мысли об этом предмете.

Ответы [ 5 ]

0 голосов
/ 22 июня 2012

Документы ARC (или это видео?) Упоминали об этом.Компилятор становится более строгим по отношению к необъявленным методам.Обычно, добавление правильного заголовочного файла должно исправить это, но я не знаком с API Facebook, поэтому не могу сказать точно.

0 голосов
/ 22 июня 2012

Мне удалось успешно реализовать Facebook ... но с помощью только всплывающего метода входа в приложение.Подробности были добавлены в качестве редактирования к моему исходному сообщению.

0 голосов
/ 23 марта 2012

Нужно ли сохранять сильную ссылку на объект facebook?Казалось бы, он не поддерживает свой статус делегата.

0 голосов
/ 23 марта 2012

Используйте API Graph Facebook, если вы решите вашу проблему

// get information about the currently logged in user
[facebook requestWithGraphPath:@"me" andDelegate:self];

ИЛИ

facebook = [[Facebook alloc] initWithAppId:@"YOUR_APP_ID" andDelegate:self];

This instance is used to invoke SSO, as well as the Graph API and Platform Dialogs from within the app.

ваш класс должен реализовать требуемый делегат Facebook

0 голосов
/ 23 марта 2012

Используете ли вы версию SDK, в которой нет метода authorize:delegate:? Может быть, вам нужно сделать это:

facebook.delegate = self;
[facebook authorize:permissions];
...