Answer the question
In order to leave comments, you need to log in
How to change the label when clicking on a button in another controller?
The bottom line is that when I click on the "Add" button on the far right controller, I want to change the label on the other controller.
Right Controller - WBCAddWaterViewController.h (.m)
Left Controller - WBCViewController.h (.m)
How do I do this?
Answer the question
In order to leave comments, you need to log in
in WBCViewController subscribe to the event:
-(void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(needChangeLabel:) name:@"WBCAddWaterViewControllerChangeLabelNotification" object:nil];
}
- (void)needChangeLabel:(NSNotification *)n
{
NSLog(@"%@", n.userInfo);
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"WBCAddWaterViewControllerChangeLabelNotification" object:nil];
}
NSDictionary *userInfo = @{@"key1" : @"value1", @"key2" : @"value2"};
[[NSNotificationCenter defaultCenter] postNotificationName:@"WBCAddWaterViewControllerChangeLabelNotification" object:nil userInfo:userInfo];
It is better to refuse the option with notifications, this is from a cannon on sparrows. Then there will be half of the notification application to catch from one view to another.
IMHO, it is more logical to use the delegation pattern here.
Controller with "add" button
@protocol AddControllerDelegate <NSObject>
// здесь передаете то, что было добавлено. если ничего не надо передавать, то без второго параметра
@required
- (void)addController:(AddController *)controller addedObject:(id)object;
@end
@interface AddController : UIViewController
@property (nonatomic, weak) id<AddControllerDelegate> delegate;
@end
// .h
@interface LabelController : UIViewController
@end
// .m
@interface LabelController() <AddControllerDelegate>
@property (nonatomic, weak) IBOutlet UILabel *label;
@end
@implementation LabelController
- (void)prepareForSegue:(UIStoryboardSegue *)segue
{
if ([segue.identifier isEqualToString:@"your-segue-identifier"]) {
AddController *addController = segue.destinationController;
addController.delegate = self;
}
}
#pragma mark - AddControllerDelegate
- (void)addController:(AddController *)controller addedObject:(id)object
{
// здесь достаете новый текст label из пришедших данных
NSString *labelText = [object labelText];
self.label.text = labelText;
}
@end
@Extremesarova I didn't mean to do all the work for you, I gave you a concept to apply.
// WBCAddWaterViewController.h
@class WBCAddWaterViewController;
@protocol WBCAddWaterViewControllerDelegate <NSObject>
// здесь вместо WBCWater подставьте имя класса, который отображает вашу модель.
// ну или если я не угадал - второй параметр должен быть такого типа и так называться, чтобы показывать, что передается. Передаете просто строку - значит addedName:(NSString *)name. Никаких id, никакого кастования - максимум конкретики.
@required
- (void)addWaterController:(WBCAddWaterViewController *)controller addedWater:(WBCWater *)water;
@end
@interface WBCAddWaterViewController : UIViewController
@property (nonatomic, weak) id<WBCAddWaterViewControllerDelegate> delegate;
@end
// WBCAddWaterViewController.m
@implementation WBCAddWaterViewController
// обработка нажатия на кнопку "Добавить"
- (IBAction)addButtonTap:(id)sender
{
WBCWater *water = ...;
[self.delegate addWaterController:self addedWater:water];
// не делайте здесь popViewController!
}
@end
// .h
@interface WBCViewController : UIViewController
@end
// .m
@interface WBCViewController() <WBCAddWaterViewControllerDelegate>
@property (nonatomic, weak) IBOutlet UILabel *label;
@end
@implementation WBCViewController
- (void)prepareForSegue:(UIStoryboardSegue *)segue
{
// это segue, протянутая из WBCViewController в WBCAddWaterViewController
// ей надо задать идентификатор и записать сюда
if ([segue.identifier isEqualToString:@"your-segue-identifier"]) {
WBCAddWaterViewController *addController = segue.destinationController;
addController.delegate = self;
}
}
#pragma mark - WBCAddWaterViewControllerDelegate
- (void)addWaterController:(WBCAddWaterViewController *)controller addedWater:(WBCWater *)water
{
// я написал [water name] наугад, и вообще я сам WBCWater пытался угадать
// здесь уже пора самому разобраться что и откуда
NSString *labelText = [water name];
self.label.text = labelText;
// делегат должен бы сам управлять скрытием контроллера.
// здесь очень здорово бы использовать unwindind segues, но сложно объяснить
[self.navigationController popViewControllerAnimated:YES];
}
@end
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question