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

时间:2012-01-18 21:00:16

标签: iphone uiview modalviewcontroller

我试图在有人在模态视图中进行更改后更新父视图中的UILabel。因此,在他们单击“保存”后...新输入的值将更改父视图控制器上显示的文本。

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

关于我可以尝试的任何想法?我已经尝试了一些东西,但由于视图已经加载,没有任何东西得到“刷新”。

谢谢!

3 个答案:

答案 0 :(得分:8)

有很多方法可以做到这一点。一种方法是使用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. 请务必通过添加NSNotificationCenter
  3. 来重新启动您在主视图中使用的[[NSNotificationCenter defaultCenter] removeObserver:self];

答案 1 :(得分:3)

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

在父视图控制器的标题中:

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

按下保存按钮时,将通知代理人,并通过委派方法发送文本视图中的文本。

答案 2 :(得分:2)

SWIFT中的

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

在OtherView中:

@IBAction func closePopUp(sender: AnyObject) {

       NSNotificationCenter.defaultCenter().postNotificationName("DoUpdateLabel", object: nil, userInfo: nil)
    }