попытка обновить UILabel на родительском контроллере представления при отклонении модального представления
Я пытаюсь обновить UILabel в Родительском представлении после того, как кто-то внес изменения в модальное представление. Итак, после того, как они нажмут "сохранить"... вновь введенное значение изменит текст, отображаемый на родительском контроллере представления.
Но, похоже, я не могу заставить эту UILabel обновить только что введенное значение.
Есть идеи, что я могу попробовать? Я попробовал несколько вещей, но поскольку вид уже загружен, ничто не становится "обновленным".
Спасибо!
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 вещи:
- в этом сценарии всегда предпочтительнее иметь общий модальный режим данных, где вы сохраняете ваши данные, так что вы можете получить доступ к этим данным в любом представлении в вашей программе. Другими словами, это хорошая практика, чтобы отделить данные от классов.
- Не забудьте восстановить
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) }