试图更新父视图控制器上的UILabel时解除模态视图
问题描述:
我想在有人在模态视图中进行更改后更新父视图中的UILabel。所以,他们点击“保存”后,新输入的值会改变在父视图控制器上显示的文本。试图更新父视图控制器上的UILabel时解除模态视图
但是,我似乎无法得到该UILabel刷新新输入的值。
关于我可以尝试的任何想法?我已经尝试了一些东西,但是当视图已经加载时,没有任何东西正在被“刷新”。
谢谢!
答
有很多方法可以做到这一点。一种方法是使用NSNotificationCenter
能够在不同类别之间进行呼叫。因此,在父视图,你将有专人负责更新功能(允许调用它updateLabel),您将执行以下操作:
- (void) updateLabel
{
yourLabel.text = @"what you need";
}
- (void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateLabel) name:@"DoUpdateLabel" object:nil];
}
现在,在其他视图只是张贴在保存按钮的通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"DoUpdateLabel" object:nil userInfo:nil];
编辑: 我要在这里提到两两件事:
- 在这种情况下它始终是最好有嘘在数据模式中保存您的数据,以便您可以在程序的任何视图中访问这些数据。换句话说,将数据从类中分离出来是一种很好的做法。
- 记得在SWIFT加入
[[NSNotificationCenter defaultCenter] removeObserver:self];
答
详细说明我的评论。这是我将如何实现委托方法来更新标签。
在父视图控制器的标题:
#import "ModalViewController.h"
@interface ViewController : UIViewController <ModalViewControllerDelegate>
/* This presents the modal view controller */
- (IBAction)buttonModalPressed:(id)sender;
@end
并在实施:
/* Modal view controller did save */
- (void)modalViewControllerDidSave:(ModalViewController *)viewController withText:(NSString *)text
{
NSLog(@"Update label: %@", text);
}
/* Prepare for segue */
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"modalSegue"])
{
ModalViewController *mvc = (ModalViewController *) segue.destinationViewController;
mvc.delegate = self;
}
}
/* Present modal view */
- (IBAction)buttonModalPressed:(id)sender
{
[self performSegueWithIdentifier:@"modalSegue" sender:self];
}
这里你可以看到在顶部的委派方法。
模态视图控制器的报头将包含委托协议这样的:
@protocol ModalViewControllerDelegate;
@interface ModalViewController : UIViewController
@property (nonatomic, weak) id <ModalViewControllerDelegate> delegate;
- (IBAction)buttonSavePressed:(id)sender;
@end
@protocol ModalViewControllerDelegate <NSObject>
- (void)modalViewControllerDidSave:(ModalViewController *)viewController withText:(NSString *)text;
@end
模态视图控制器的实施将包含类似于此的方法:
/* Save button was pressed */
- (IBAction)buttonSavePressed:(id)sender
{
if ([self.delegate respondsToSelector:@selector(modalViewControllerDidSave:withText:)])
[self.delegate modalViewControllerDidSave:self withText:@"Some text"];
[self dismissModalViewControllerAnimated:YES];
}
当按下保存按钮,通知委托并通过委托方法发送文本视图中的文本。
答
到resomve的NSNotificationCenter
您在主视图中使用:
ParentViewController:
func updateLabel() {
yourLabel.text! = "what you need"
}
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.updateLabel), name: "DoUpdateLabel", object: nil)
}
在奥瑟维尤:
@IBAction func closePopUp(sender: AnyObject) {
NSNotificationCenter.defaultCenter().postNotificationName("DoUpdateLabel", object: nil, userInfo: nil)
}
我会制定一个授权方法。当按下“保存”按钮时,模式将被解除,调用委托方法。父视图实现了这种委托方法,并且在调用它时刷新标签。 – simonbs 2012-01-18 21:06:00