Obj-C Отправка сообщений между классами

Я новичок в программировании для iPhone. Я пытаюсь отправить сообщение с одного контроллера представления на другой. Идея состоит в том, что viewControllerA берет информацию от пользователя и отправляет ее viewControllerB. Затем viewControllerB должен отображать информацию в метке.

viewControllerA.h

#import <UIKit/UIKit.h>
@interface viewControllerA : UIViewController
{
    int num;
}

-(IBAction)do;
@end

viewControllerA.m

#import "viewControllerA.h"
#import "viewControllerB.h"

@implementation viewControllerA

- (IBAction)do {
    //initializing int for example
    num = 2;
    viewControllerB *viewB = [[viewControllerB alloc] init];
    [viewB display:num];
    [viewB release];
    //viewA is presented as a ModalViewController, so it dismisses itself to return to the 
    //original view, i know it is not efficient 
    [self dismissModalViewControllerAnimated:YES];
}

- (void)dealloc {
    [super dealloc];
}

@end

viewControllerB.h

#import <UIKit/UIKit.h>

@interface viewControllerB : UIViewController
{
    IBOutlet UILabel *label;
}

- (IBAction)openA;
- (void)display:(NSInteger)myNum;

@end

viewControllerB.m

#import "viewControllerB.h"
#import "viewControllerA.h"

@implementation viewControllerB

- (IBAction)openA {
    //presents viewControllerA when a button is pressed
    viewControllerA *viewA = [[viewControllerA alloc] init];
    [self presentModalViewController:viewA animated:YES];
}

- (void)display:(NSInteger)myNum {
    NSLog(@"YES");
    [label setText:[NSString stringWithFormat:@"%d", myNum]];
}

@end

YES регистрируется успешно, но текст метки не меняется. Я убедился, что все мои подключения в Interface Builder корректны, ведь в моей программе есть другие методы (IBAction), которые изменяют текст этой самой метки, и все эти другие методы работают отлично...

Есть идеи, ребята? Вам не нужно давать мне полное решение, любая информация поможет. Спасибо.


person user544359    schedule 09.01.2011    source источник
comment
Просто чтобы вы знали, что методы IBAction принимают один параметр (id)sender.   -  person Abizern    schedule 09.01.2011
comment
пс. На самом деле это не ваш вопрос, но также следите за утечками памяти. За любым alloc (или copy, new, retain) должен следовать release или autorelease.   -  person mvds    schedule 09.01.2011
comment
@Abizern Они не обязаны. Они могут соответствовать любой из форм, указанных в developer.apple.com/library/ios/documentation/UIKit/Reference/   -  person Justin Spahr-Summers    schedule 10.01.2011
comment
@Justin - я не знал об UIApplication. Спасибо!   -  person Abizern    schedule 10.01.2011


Ответы (1)


С участием

viewControllerB *viewB = [[viewControllerB alloc] init];

вы создаете новый экземпляр viewControllerB. Это не тот viewControllerB, который (я полагаю) у вас есть в вашем файле пера. Для этого нужно сделать розетку и подключить.

В противном случае, возможно, создайте экземпляр с помощью [... initWithNibName:] из пера, а не только [... init], а затем (в любом случае) нажмите на созданный экземпляр контроллера представления, используя [self.navigationController pushViewController:viewB animated:YES], или представив его модально, как вы, кажется, уже освоили.

В качестве примечания, возможно, назовите переменную контроллера представления viewConB, поскольку существует четкое и важное различие между представлениями и контроллерами представления. Кроме того, имена классов, как правило, начинаются с прописных букв, а переменные — со строчных, чтобы все было понятно.

person mvds    schedule 09.01.2011
comment
Как я могу создать выход для viewControllerB в файле viewControllerA, поскольку я создавал экземпляр B в viewControllerA? - person user544359; 10.01.2011
comment
Если вы создаете экземпляры контроллеров представления, используя только alloc/init, весь файл пера даже не вступает в игру. Вам нужно будет установить выходные переменные вручную после alloc/init, например. установив viewB.someProperty = self; - person mvds; 10.01.2011