Отправка сообщений между классами Obj-C? - PullRequest
0 голосов
/ 16 декабря 2010

Я новичок в программировании 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 but it is not the problem with my code 
[self dismissModalViewControllerAnimated:YES];
}

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

@end

viewControllerB.h

#import <UIKit/UIKit.h>
@interface viewControllerB : UIViewController
{
IBOutlet UILabel *label;
}
- (void)display:(int)myNum;

@end

viewControllerB.m

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

@implementation viewControllerB

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

@end

ДА успешно зарегистрировано, но текст метки не изменяется. Может отправленные сообщения не получить доступ к переменным экземпляра или что-то?

Спасибо.

Ответы [ 5 ]

1 голос
/ 16 декабря 2010

Есть ли в вашем коде нечто большее, чем то, что вы здесь показываете? Я не вижу, как отображается viewB - нет [self.view addSubview: viewB.view] или чего-либо, что бы указывало на то, что это будет показано в представлении. Возможно, в этом проблема?

1 голос
/ 16 декабря 2010

Кажется, что ваш label ни на что не указывает (поэтому, когда вы сообщаете его setText:, это сообщение просто отправляется на nil и, таким образом, ничего не происходит).

ПроверкаИнтерфейсный Разработчик, чтобы убедиться, что вы установили, чтобы выход фактически указывал на метку в вашем представлении.

1 голос
/ 16 декабря 2010

Нет ничего плохого в отправке сообщений так, как вы пытаетесь. Ошибка в использовании 'int' в качестве типа. Используйте NSInteger в Objective-C, чтобы облегчить многочисленные головные боли.

1 голос
/ 16 декабря 2010

Замените все int на NSInteger.it решит вашу проблему.

Edit:

Хорошо, если у вас правильное соединение.

на самом деле, что происходит, вы называетепокажите функцию из viewA и попробуйте написать текст поверх метки viewB отсюда, прежде чем загружать данные страницы, почему вы столкнулись с проблемой. Поэтому для решения этой проблемы вам нужно отправить значение в viewB и записать текст поверх метки в методе viewDidLoad.это решит вашу проблему.

0 голосов
/ 16 декабря 2010

Можете ли вы уточнить, что вы делаете здесь, и как эти контроллеры представления связаны с тем, что на экране?Насколько я понимаю, viewControllerA представлен как модальный диалог, который собирает информацию?Он представлен viewControllerB, и когда A закрывает B, устанавливает на экране свою метку, чтобы отразить значение, возвращаемое из A?

Если это так, вам нужно иметь ссылку на B в A по нескольким причинам.Во-первых, вы запускаете экземпляр B в функции A do и говорите ему, чтобы он отображал ваш номер, но я не вижу, чтобы вы где-то отображали B на экране.Во-вторых, вызов dismissModalViewControllerAnimated: для A не приведет к отказу от A, он отменит модальный контроллер представления, представленный A.Таким образом, чтобы уволить А, нужно сказать [self dismissModalViewControllerAnimated:YES]; на Б. Это лучше всего сделать, если А уведомит В, что он готов к закрытию.

...