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】:您可以使用addTarget
和removeTarget
更改目标操作,如related question 中所述。
这里的问题是有一种优雅的方式来检测是否登录的状态。您可以考虑一个全局变量,但大多数在大多数情况下它是一个糟糕的解决方案。
另一种方法是检查UIButton
的NSString *title
属性。
一个不错的方法是在 Web 应用程序中使用一种“会话”机制,这将为您提供应用程序范围内的状态。
【讨论】:
以上是关于UINavigationBar 按钮,根据点击改变 IBAction的主要内容,如果未能解决你的问题,请参考以下文章
单击后退按钮时,导航堆栈中 VC 的 UINavigationBar 标题颜色不会改变
popViewControllerAnimated 改变 UINavigationBar 的 UIColor