попытка обновить UILabel на родительском контроллере представления при отклонении модального представления


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

Но, похоже, я не могу заставить эту UILabel обновить только что введенное значение.

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

Спасибо!

3 3

3 ответа:

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

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

  1. в этом сценарии всегда предпочтительнее иметь общий модальный режим данных, где вы сохраняете ваши данные, так что вы можете получить доступ к этим данным в любом представлении в вашей программе. Другими словами, это хорошая практика, чтобы отделить данные от классов.
  2. Не забудьте восстановить NSNotificationCenter, который вы использовали в главном представлении, добавив [[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];
}

При нажатии кнопки Сохранить делегат получает уведомление, и текст в текстовом представлении отправляется с помощью метода делегирования.

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