试图更新父视图控制器上的UILabel时解除模态视图

问题描述:

我想在有人在模态视图中进行更改后更新父视图中的UILabel。所以,他们点击“保存”后,新输入的值会改变在父视图控制器上显示的文本。试图更新父视图控制器上的UILabel时解除模态视图

但是,我似乎无法得到该UILabel刷新新输入的值。

关于我可以尝试的任何想法?我已经尝试了一些东西,但是当视图已经加载时,没有任何东西正在被“刷新”。

谢谢!

+0

我会制定一个授权方法。当按下“保存”按钮时,模式将被解除,调用委托方法。父视图实现了这种委托方法,并且在调用它时刷新标签。 – simonbs 2012-01-18 21:06:00

有很多方法可以做到这一点。一种方法是使用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]; 

编辑: 我要在这里提到两两件事:

  1. 在这种情况下它始终是最好有嘘在数据模式中保存您的数据,以便您可以在程序的任何视图中访问这些数据。换句话说,将数据从类中分离出来是一种很好的做法。
  2. 记得在SWIFT加入[[NSNotificationCenter defaultCenter] removeObserver:self];
+0

工作完美,非常直接。谢谢! – TheTC 2012-01-18 22:00:30

+0

为此感到高兴,欢迎您:) – antf 2012-01-18 22:04:27

详细说明我的评论。这是我将如何实现委托方法来更新标签。

在父视图控制器的标题:

#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]; 
} 

当按下保存按钮,通知委托并通过委托方法发送文本视图中的文本。

+0

这似乎很稳固。非常感谢你。现在要测试一下。 – TheTC 2012-01-18 21:31:08

+0

谢谢。可能希望查看[这个答案](http://*.com/a/6169104/426839)更全面的解释一些强烈的建议,如总是使委托属性弱引用。 – 2015-02-24 19:01:50

+0

诚然,代表一定是软弱的。那是个错误。我已经更新了答案。谢谢。 – simonbs 2015-02-24 22:28:16

到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) 
    }