UIBarbuttonItem不会改变

时间:2013-03-18 23:34:33

标签: facebook ios6 uibarbuttonitem

我正在尝试启动UIbarbuttonItem来登录/注销Facebook。我可以登录确定但无法注销,UIBarbuttonItem标题不会更改或发起注销过程。

以下是一些代码:

    - (void)viewDidLoad {

[super viewDidLoad];

   [[NSNotificationCenter defaultCenter]
 addObserver:self
 selector:@selector(sessionStateChanged:)
 name:FBSessionStateChangedNotification
 object:nil];

NSLog(@"Session changed");
AppDelegate *appDelegate =  (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate openSessionWithAllowLoginUI:NO];
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(sessionStateChanged:) userInfo:nil repeats:NO];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willBeginBannerViewActionNotification:) name:BannerViewActionWillBegin object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishBannerViewActionNotification:) name:BannerViewActionDidFinish object:nil];

}

    - (IBAction)authButtonAction:(id)sender {
NSLog(@"session open");
AppDelegate *appDelegate = (AppDelegate*)
[[UIApplication sharedApplication] delegate];

// If the user is authenticated, log out when the button is clicked.
// If the user is not authenticated, log in when the button is clicked.
if (FBSession.activeSession.isOpen) {
    [appDelegate closeSession];
} else {
    // The user has initiated a login, so call the openSession method
    // and show the login UX if necessary.
    [appDelegate openSessionWithAllowLoginUI:YES];
}

}

    - (void)sessionStateChanged:(NSNotification*)notification {
NSLog(@"Login Activated");
self.navigationItem.leftBarButtonItem = authButton;
if (FBSession.activeSession.isOpen) {
    self.authButton =[[UIBarButtonItem alloc] initWithTitle:@"Login" style:UIBarButtonItemStyleBordered target:self action:@selector(sessionStateChanged:)];

}else{

    self.authButton =[[UIBarButtonItem alloc]  initWithTitle:@"Logout" style:UIBarButtonItemStyleBordered target:self action:@selector(sessionStateChanged:)];

}

}

日志报告:

    2013-03-18 23:05:58.739 prompT[4056:907] Session changed
    2013-03-18 23:05:58.760 prompT[4056:907] 
    fb sdk error = (null)
    2013-03-18 23:05:58.763 prompT[4056:907] User session found
    2013-03-18 23:05:58.765 prompT[4056:907] Login Activated
    2013-03-18 23:05:59.268 prompT[4056:907] Login Activated
    2013-03-18 23:06:00.872 prompT[4056:907] AdAbanner failed
    2013-03-18 23:06:01.664 prompT[4056:907] Login Activated

我也使用故事板。有什么想法和帮助吗?

1 个答案:

答案 0 :(得分:1)

sessionStateChanged方法有一些错误,这里有一些评论

  - (void)sessionStateChanged:(NSNotification*)notification {
NSLog(@"Login Activated");

self.navigationItem.leftBarButtonItem = authButton;
       //what is this assignment doing? What is authButton? An iVar?


if (FBSession.activeSession.isOpen) {
    self.authButton =[[UIBarButtonItem alloc] initWithTitle:@"Login" style:UIBarButtonItemStyleBordered target:self action:@selector(sessionStateChanged:)];

  //self.authButton is not the same entity as authButton.
  //did you intend to set authButton here and then 
  //assign it to self.navigationItem.leftBarButtonItem after the conditional?       


}else{

    self.authButton =[[UIBarButtonItem alloc]  initWithTitle:@"Logout" 
               style:UIBarButtonItemStyleBordered 
               target:self action:@selector(sessionStateChanged:)];
    //is this really the action you want, or is it rather `authButtonAction`?

}

您要做的就是更改按钮的标题:

    - (void)sessionStateChanged:(NSNotification*)notification {
        NSString* buttonTitle = @"Login";
        if (FBSession.activeSession.isOpen) {
            buttonTitle = @"Logout";
        }
        self.navigationItem.leftBarButtonItem.title = buttonTitle;
    }

您之前应该在viewDidLoad或storyboard中分配,初始化并放置leftBarButtonItem。当你这样做时,你应该正确地连接IBAction。

代码版本......

- (void) viewDidLoad {
    [super viewDidLoad];
    UIBarButtonItem* barButton =
        [[UIBarButtonItem alloc] initWithTitle:@"login"
                                         style:UIBarButtonItemStyleBordered
                                        target:self
                                        action:@selector(authButtonAction:)];
    self.navigationItem.leftBarButtonItem = barButton;

}