随时访问在另一个视图控制器中创建的对象

sha*_*jem 2 cocoa-touch objective-c ios

我有一个逻辑问题.我需要从另一个类访问一个对象的实例.

我有一个叫做的课FacebookController.例如,它有几个委托方法fbDidLogin.首先,facebookloginButtonClicked当用户点击按钮时执行该方法,并且在一些内部处理之后,fbDidLogin将调用该方法,并且用户将登录到该应用程序.(所有这一切都很完美).

现在我需要从应用程序注销.有一个名为的委托方法logout,我必须将其称为[facebook logout].

我添加了一个名为的方法-(void) logoutFacebook.当用户单击注销按钮时,将调用以下方法.注销方法如下;

-(void) logoutFacebook {
   [facebook logout];    
}
Run Code Online (Sandbox Code Playgroud)

仅当我从同一个viewController注销(调用logoutFacebook方法)时,注销才有效.

例如,如果我在一个被调用的类中Student,我试图调用该logoutFacebook方法FacebookController.我的方法如下;

FacebookController *facebookController = [[FacebookController alloc]]init;

[facebookController logoutFacebook];
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为通过这样做,它将创建一个新的实例FacebookController.所以我需要以某种方式访问​​原始facebook对象FacebookController(在登录后创建).如何访问此对象?

代码:

-(void)facebookloginButtonClicked:(id)sender{
 facebook = [[Facebook alloc] initWithAppId:@"3232232" andDelegate:self];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"] 
        && [defaults objectForKey:@"FBExpirationDateKey"]) {

        facebook.accessToken  = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
    }

    if (![facebook isSessionValid]) {        
        [facebook authorize:nil];      

    }
}
- (void)fbDidLogin {

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

    }

-(void) logoutFacebook {
       [facebook logout];    
    }
Run Code Online (Sandbox Code Playgroud)

Shu*_*ank 5

FacebookController.m类中添加@implementation上面的代码

static FacebookController* Object;
Run Code Online (Sandbox Code Playgroud)

将以下函数添加到.h文件中

+ (FacebookController *) sharedInstance
Run Code Online (Sandbox Code Playgroud)

在.m文件中实现上述功能

+ (FacebookController *) sharedInstance
{
if( Object == nil)
{
Object = [[FacebookController alloc]]init;
}

return Object;

}
Run Code Online (Sandbox Code Playgroud)

现在,无论你想在哪里使用Facebook对象,都可以这样使用它

[FacebookController sharedInstance];
Run Code Online (Sandbox Code Playgroud)

现在你FacebookController的应用程序的整个生命周期中只有一个类实例.这就是所谓的单例模式 ..你可以找到google来获取更多细节.