A
A
Artem Ryblov2014-03-30 23:56:35
Objective-C
Artem Ryblov, 2014-03-30 23:56:35

How to change the label when clicking on a button in another controller?

07ea44cc54514c70a30147a6bba5ef1f.png
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

3 answer(s)
D
Denis Morozov, 2014-03-31
@Extremesarova

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

in WBCAddWaterViewController send an event:
NSDictionary *userInfo = @{@"key1" : @"value1", @"key2" : @"value2"};
[[NSNotificationCenter defaultCenter] postNotificationName:@"WBCAddWaterViewControllerChangeLabelNotification" object:nil userInfo:userInfo];

A
Alexey Storozhev, 2014-03-31
@storoj

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

The label controller must implement the protocol and, when switching to the second controller,
set itself as a delegate for the second
// .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

A
Alexey Storozhev, 2014-04-02
@storoj

@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

I repeat, mindlessly copy-pasting will not work.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question