попытка обновить UILabel на родительском контроллере представления при отклонении модального представления - PullRequest
3 голосов
/ 19 января 2012

Я пытаюсь обновить UILabel в родительском представлении после внесения изменений в модальное представление.Итак, после того, как они нажмут «сохранить» ... вновь введенное значение изменит текст, отображаемый на родительском контроллере представления.

Но я не могу заставить UILabel обновить обновленное значение.

Есть идеи, что я могу попробовать?Я пробовал несколько вещей, но, поскольку представление уже загружено, ничто не обновляется.

Спасибо!

Ответы [ 3 ]

8 голосов
/ 19 января 2012

Есть много способов сделать это. Одним из способов является использование 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];

EDIT: Я должен упомянуть 2 вещи здесь:

  1. В этом сценарии всегда предпочтительнее использовать модальные общие данные, в которых вы сохраняете свои данные, чтобы вы могли получить доступ к этим данным в любом представлении вашей программы. Другими словами, рекомендуется отделять данные от классов.
  2. Не забудьте восстановить NSNotificationCenter, который вы использовали в главном окне, добавив [[NSNotificationCenter defaultCenter] removeObserver:self];
3 голосов
/ 19 января 2012

Чтобы уточнить мой комментарий.Вот как я реализовал бы метод делегирования для обновления метки.

В заголовке контроллера родительского представления:

#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 голосов
/ 12 сентября 2016

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

В другом виде:

@IBAction func closePopUp(sender: AnyObject) {

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