我是客观编程的新手,对于这个愚蠢的问题感到抱歉。 我正在为一些社交网络做一些信使,而且我一直坚持这么简单 - 如何从一个类的对象发送消息到另一个类的对象?
我有一个名为SignInViewController的类,它在按下SignUpButton后创建一个SignUpViewController实例,就像这样:
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。我知道我做错了什么,但我无法弄明白到底是什么。
你能帮帮我吗?
答案 0 :(得分:2)
您可以使用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中的方法。就是这样。您在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 :(得分:2)
如果你在按钮事件上使用委托更好,你可以在你创建按钮的地方声明你的委托,只需在任何你想要使用该委托的类中使用该委托它是非常有用的学习委托的目标c它简单有效
答案 2 :(得分:1)
您的ServerManager
类需要引用SignUpViewController
实例。现在你得到的类的self
不是类实例的。您的ServerManager
课程可能应该有一个属性,该属性引用了您SignUpViewController
的实例。
答案 3 :(得分:1)
看起来您正在尝试向类(SignUpViewController
)发送消息而不是它的实例/对象(signUpViewController
):
更改
[[SignUpViewController self] showTheCodeTextField];
到
[[signUpViewController self] showTheCodeTextField];
你应该是o.k。
答案 4 :(得分:1)
如果在ServerManager实例中有一个SignUpViewController实例,则使用此约定(假设您的实例名为'signUpController'):
[[self signUpController] showTheCodeTextField];
另一种可能性是向ServerManager发送包含对SignUpViewController的引用的通知,并将showTheCodeTextField消息传递给它。这假设您了解如何发送通知。
祝你好运。你看起来刚刚开始使用Cocoa和Objective-C。挂在那里!