从其他视图更新 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 标题

向 UIButton 添加插座

向 UIButton 添加其他视图

如何使用 Interface Builder 在其他 UI 元素的背景中添加 UIButton?

如何使用 WatchKit 更新 UI?

一般 XCode UI 问题 [重复]