UINavigationBar 按钮,根据点击改变 IBAction

Posted

技术标签:

【中文标题】UINavigationBar 按钮,根据点击改变 IBAction【英文标题】:UINavigation Bar Button, change IBAction depending on click 【发布时间】:2011-07-02 15:33:01 【问题描述】:

好的,现在我有一个带有右键的导航控制器,可以让用户登录。

但是,我想在单击登录按钮后将其更改为注销,并且此注销按钮将调用不同的 IBAction。

帮助形象化。

默认情况下,我在导航控制器上有一个右键按钮,上面写着登录,一旦按下这个登录按钮,就会按下 ibaction login:(id)sender。

我想要做的是将按钮更改为注销并在单击时调用 logout:(id)sender。

这可能吗。

谢谢。

【问题讨论】:

【参考方案1】:

您可以更改按钮按下时的功能:

- (void)login:(UIButton*)button 
    [button setTitle:@"Logout"];        
    [button setAction:@selector(logout:)];


- (void)logout:(UIButton*)button 
    [button setTitle:@"Login"];     
    [button setAction:@selector(login:)];

或者,由于按钮位于 UINavigationBar 上,您可以改为这样做:

-(IBAction)login:(id)sender
UIBarButtonItem *logoutButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                                                            target:self
                                                                            action:@selector(logout:)];
[[self navigationItem] setRightBarButtonItem:logoutButton];
[logoutButton release];


-(IBAction)logout:(id)sender
UIBarButtonItem *loginButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                                                            target:self
                                                                            action:@selector(login:)];
[[self navigationItem] setRightBarButtonItem:loginButton];
[loginButton release];

【讨论】:

它有点工作,它将标题更改为注销。但是当我点击它时。它出现此错误 [HubViewController logout]: unrecognized selector sent to instance 0x791b810 2011-07-02 17:07:12.173 FaceDirectory[58935:207] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“- [HubViewController 注销]:无法识别的选择器发送到实例 0x791b810' *** 第一次抛出调用堆栈: @Mintuz:这是因为你还没有设置-logout 方法。创建它,错误就会消失。【参考方案2】:

您可以为按钮设置两种不同的标题或图像,一种用于正常/默认状态,另一种用于选择状态。

同样,您可以根据按钮的状态设置两种不同的操作。 因此,如果按钮处于正常/默认状态,则用户需要登录。用户登录后,我们将按钮置于选中状态。

因此,如果按钮处于选中状态,用户需要退出。

通过这种方式,我们可以不断切换同一个按钮的状态,来做两种不同的操作。

代码看起来像这样。

-(IBAction) loginButtonPressed:(id) sender 
    UIButton *loginButton = (UIButton *) sender;

    if (loginButton.selected == NO) 
        // Represents user needs to login. Code for login user.
    else
        // Represents user needs to logout. Code for logout user.
    

    // toggle the login/logout states.
    loginButton.selected = !loginButton.selected;

您可以为正常/选定/突出显示/禁用状态的按钮指定标题/图像。 只需一个按钮即可完成您的工作。

【讨论】:

【参考方案3】:

您可以使用addTargetremoveTarget 更改目标操作,如related question 中所述。

这里的问题是有一种优雅的方式来检测是否登录的状态。您可以考虑一个全局变量,但大多数在大多数情况下它是一个糟糕的解决方案。

另一种方法是检查UIButtonNSString *title 属性。

一个不错的方法是在 Web 应用程序中使用一种“会话”机制,这将为您提供应用程序范围内的状态。

【讨论】:

以上是关于UINavigationBar 按钮,根据点击改变 IBAction的主要内容,如果未能解决你的问题,请参考以下文章

单击后退按钮时,导航堆栈中 VC 的 UINavigationBar 标题颜色不会改变

UINavigationBar 后退按钮标题更改方向更改

popViewControllerAnimated 改变 UINavigationBar 的 UIColor

更改 UINavigationBar 按钮图像

如何防止在 UINavigationbar 上同时触摸按钮的双重动作?

我需要制作一个按钮,该按钮的文本将根据整数而改变