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

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

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

帮助形象化。

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

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

这可能吗。

谢谢。

【问题讨论】:

    标签: iphone objective-c cocoa-touch uinavigationcontroller


    【解决方案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 应用程序中使用一种“会话”机制,这将为您提供应用程序范围内的状态。

      【讨论】:

        猜你喜欢
        • 2019-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多