从其他视图更新 UIButton 标题...?
Posted
技术标签:
【中文标题】从其他视图更新 UIButton 标题...?【英文标题】:Update UIButton title from other view...? 【发布时间】:2013-04-30 12:03:49 【问题描述】:我正在开发一个 iPad 应用程序。在某些阶段,我需要使用下拉类型的功能。所以,我也在使用 UIPopoverView。
当 IBAction 在点击特定 UIButton 时触发时,我会调整 popoverview 渲染 UITableViewController。
一切正常。我需要当用户点击任何单元格时,需要在附加的 UIButton 标题中设置相关的单元格值。
这里,popover 视图是 UITableViewController 视图,它是我单独创建的。并在选择 Outlet IBAction 时调用它。
CGRect dropdownPosition = CGRectMake(self.btnOutlet.frame.origin.x, self.btnOutlet.frame.origin.y, self.btnOutlet.frame.size.width, self.btnOutlet.frame.size.height);
[pcDropdown presentPopoverFromRect:dropdownPosition inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
谢谢
【问题讨论】:
从表格视图中更新您的按钮文本并选择方法 感谢您的回复,是的,我想要那个东西。但我不知道如何实现这一目标。请帮我写一些代码。 从表视图调用委托方法确实选择到您的主视图控制器,传递所需的信息,然后更新委托方法内的按钮。 UITableViewCell *c = [tableView cellForRowAtIndexPath:indexPath]; [btnname setTitle:c.textLabel.text forState:UIControlStateNormal]; 但是如何在这个视图中访问 btnname,这是另一个包含 UITableViewController 的视图。 【参考方案1】:Sangony 的答案几乎是正确的,但有一些细微的变化,而不是注册没有参数的方法作为观察者,你应该添加它承认一个参数:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(someAction:)
name:@"ButtonNeedsUpdate"
object:nil];
然后,当您发布通知时(在您的表格视图中 didSelectRow:atIndexPath:),您可以添加一个对象(一个 NSDictionay)作为用户信息:
//...
NSDictionary *userInfoDictionary = @@"newText":@"some text";
[[NSNotificationCenter defaultCenter] postNotificationName:@"ButtonNeedsUpdate"
object:self
userInfo:userInfoDictionary];
//...
然后在观察此通知的类中,您可以使用 someAction 操作方法中的数据,如下所示:
-(void)someAction:(NSNotification)notification
NSString *textForTheButton = [[notification userInfo]objectForKey:@"newText"];
[self.myButton setTitle:textForTheButton
forState:UIControlStateNormal];
//...
你的按钮标题现在应该是“一些文字”。
【讨论】:
比设置单例更优雅更简单。 需要将自己作为观察者移除,否则会崩溃。【参考方案2】:尝试使用 NSNotificationCenter。在包含您的按钮的 VC 中放置以下代码:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(someAction)
name:@"ButtonNeedsUpdate"
object:nil];
-(void)someAction
// do stuff to your button
在任何其他导致按钮被修改的 VC 中,放置此代码以发出通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"ButtonNeedsUpdate" object:self];
【讨论】:
感谢回复,但是如何识别必须设置哪些文本,因为 someAction 没有参数 您可以设置一个 Singleton 并使用它来存储文本标签的字符串值。如果你愿意,我可以发布代码。【参考方案3】:使用didSelectItemWithTitle:
之类的方法实现委托协议。使控制按钮的视图控制器成为弹出窗口中视图控制器的委托。选择行时,请通知委托,然后可以更新按钮。
// MainController.h
#include "PopupTableController.h"
@interface MainController : UIViewController <PopUpListDelegate>
// PopupTableController.h
@protocol PopUpListDelegate;
@interface PopupTableController : UITableViewController
...
@property (nonatomic, assign) id <PopUpListDelegate> delegate;
...
@end
@protocol PopUpListDelegate
-(void)didSelectItem:(NSUInteger)item;
@end
// PopupTableController.m
// in didSelectRowAtIndexPath:
if (self.delegate)
[self.delegate didSelectItem:indexPath.row];
// MainController.m
// where you push the table view or prepareForSegue
popupTableController.delegate = self;
// and
-(void)didSelectItem:(NSInteger)item
// update the button based on item
【讨论】:
我尝试了你的解决方案,但是有一些错误 self.delegate didSelectItem:indexPath.row]; 告诉 No known instance method for selector 'didSelectItem' in PopupTableController .m 以及不完整的实现。 您必须设置委托并实现该方法。以上都说明了。 谢谢,它有帮助,但是我可以管理一个 UIButton 标题,实际上有不止一个 UIButton 调用相同的 UITableViewController...!?! 您可以任意设计委托通知。您可以根据需要传递尽可能多或尽可能少的数据。你可以有多个委托回调方法。以上是关于从其他视图更新 UIButton 标题...?的主要内容,如果未能解决你的问题,请参考以下文章
如何从模态 UIView 更新自定义单元格中的 UIButton 标题