iphone - Как отправить сообщение с одного объекта на другой? - PullRequest
3 голосов
/ 30 марта 2012

Я новичок в объективном программировании, извините за глупый вопрос.Я делаю какой-то мессенджер для какой-то социальной сети, и я застрял на очень простой вещи - как отправить сообщение от объекта одного класса на объект другого класса?

У меня есть класс, который называется SignInViewController, который создает экземпляр SignUpViewController после нажатия SignUpButton, и это делается так:

SignUpViewController *signUpViewController = [[SignUpViewController alloc]init];
signUpViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:signUpViewController animated:YES];

Затем, после некоторого управления, выполненного с помощью AFNetwork (я использую определенный классдля этого, который называется ServerManager), я хочу отправить сообщение, чтобы нарисовать новое текстовое поле в моем экземпляре SignUpViewController, и я думаю, что это можно сделать так:

в SignUpViewController.h:

- (void)showTheCodeTextField;

в ServerManager.m:

[[SignUpViewController self] showTheCodeTextField];

, а затем в SignUpViewController.m:

-(void)showTheCodeTextField
{
     NSLog(@"Time to draw codeTextField");
}

Я получаю знакомый SIGABRT в последней строке кода.Я знаю, что делаю что-то не так, но я просто не могу понять, что именно.

Не могли бы вы мне помочь, пожалуйста?

Ответы [ 5 ]

2 голосов
/ 30 марта 2012

лучше, если вы используете делегат для события кнопки, объявите свой делегат там, где вы создаете свою кнопку, и просто используйте этот делегат в любом классе, где бы вы ни захотели, просто используйте этот делегат, это очень полезно.

2 голосов
/ 30 марта 2012

Вы можете использовать NSNotificationCenter, чтобы заставить это работать. После представления вашего SignUpController вы добавляете его в качестве наблюдателя уведомлений, которые отправляет ServerManager. И когда приходит это уведомление, вы вызываете свое сообщение, чтобы нарисовать представление.

Итак, после

SignUpViewController *signUpViewController = [[SignUpViewController alloc]init];
signUpViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:signUpViewController animated:YES];

Сделать наблюдателем

[[NSNotificationCenter defaultCenter]signUpViewController selector:@selector(showTheCodeTextField:) name:@"SignUpSucceded" object:[ServerManager sharedInstance]];

Затем в диспетчере сервера вы отправляете уведомление, содержащее этот textField, и вызывается метод в вашем SignUp. Вот и все. У вас есть текст textField в вашем notification.userinfo

  [[NSNotificationCenter defaultCenter]postNotificationName:@"SignUpSucceded" object:self userInfo:[NSDictionary dictionaryWithObject:textField.text forKey:@"login"]];
     }

Начало тура Текст здесь в signUpView

  -(void)showTheCodeTextField:(NSNotification*)notification
{
     NSLog(@"Time to draw codeTextField %@",[notification userInfo]);
}
1 голос
/ 30 марта 2012

Похоже, вы пытаетесь отправить сообщение классу (SignUpViewController) вместо его экземпляра / объекта (signUpViewController):

Изменить

[[SignUpViewController self] showTheCodeTextField];

до

[[signUpViewController self] showTheCodeTextField];

и тебе должно быть хорошо.

1 голос
/ 30 марта 2012

Если у вас есть экземпляр SignUpViewController в вашем экземпляре ServerManager, вы должны использовать это соглашение (при условии, что ваш экземпляр называется 'signUpController'):

[[self signUpController] showTheCodeTextField];

Другой возможностью будет отправить ваш ServerManagerуведомление, содержащее ссылку на ваш SignUpViewController и передающее ему сообщение showTheCodeTextField.Это предполагает, что вы знаете, как отправить уведомление.

Удачи вам в ваших начинаниях.Похоже, вы только начинаете работать с Cocoa и Objective-C.Держись там!

1 голос
/ 30 марта 2012

Ваш класс ServerManager должен иметь ссылку на экземпляр SignUpViewController. Прямо сейчас вы получаете self класса, а не экземпляра класса. Вы, вероятно, должны иметь свойство в вашем классе ServerManager, которое ссылается на экземпляр вашего SignUpViewController.

...