Ios 如何访问其他类中的对象?
我想从ViewController 2访问ViewController 1中的函数。这是有效的(通过断点和NSLog输出确认)。但是从ViewController 2调用时,访问ViewController 1中定义的对象是nil ViewController 1.hIos 如何访问其他类中的对象?,ios,objective-c,xcode,Ios,Objective C,Xcode,我想从ViewController 2访问ViewController 1中的函数。这是有效的(通过断点和NSLog输出确认)。但是从ViewController 2调用时,访问ViewController 1中定义的对象是nil ViewController 1.h #import "SRWebSocket.h" @interface ViewController : UIViewController <UITextFieldDelegate, SRWebSocketDelegate&
#import "SRWebSocket.h"
@interface ViewController : UIViewController <UITextFieldDelegate, SRWebSocketDelegate>
@property (nonatomic,strong) SRWebSocket *socket;
-(void)sendMessageToServerWithContent:(NSString *)message;
#import "ViewController.h"
@property (nonatomic,strong) ViewController *viewVC;
@interface ContactsTableViewController : UITableViewController
ViewController 2.h
#import "SRWebSocket.h"
@interface ViewController : UIViewController <UITextFieldDelegate, SRWebSocketDelegate>
@property (nonatomic,strong) SRWebSocket *socket;
-(void)sendMessageToServerWithContent:(NSString *)message;
#import "ViewController.h"
@property (nonatomic,strong) ViewController *viewVC;
@interface ContactsTableViewController : UITableViewController
ViewController 2.m
- (IBAction)connect:(id)sender {
socket.delegate = nil;
socket = nil;
socket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:serverIP_GLOBAL]]];
socket.delegate = self;
}
-(void)sendMessageToServerWithContent:(NSString *)message{
//irrelevant code for question removed
[self.socket send:jsonString];
}
- (void)viewDidLoad {
[super viewDidLoad];
viewVC = [ViewController alloc];
[viewVC sendMessageToServerWithContent:@"Test"];
//When calling from here, the socket object in ViewController 1 is nil
}
调用
viewVC
,它甚至没有正确创建和初始化。这不是之前屏幕上的视图控制器
1.要调用对象的方法,应首先对其进行正确初始化
viewVC = [[ViewController alloc] init];
您说过,socket
属性在viewDidLoad
方法中初始化。要强制加载视图,如果不打算首先显示视图,请使用loadView
方法
2.如果要使用特定对象,请不要初始化另一个ViewController
。在您的情况下,它应该是显示第二个控制器的控制器
在ViewController.m文件中的某个位置,当第二个视图控制器即将出现时:
ViewController2 *second=[[ViewController2 alloc] init];
second.vc1 = self; // now the second controller has a pointer to original object
[self presentViewController:second ...];
对于segue
-导航
- (void)prepareForSegue:(UIStoryBoardSegue *)segue
{
ViewController2 *second=(ViewController2 *)segue.destinationViewController;
send.vc1 = self;
}
现在在ViewController 2
viewDidLoad
方法中
- (void)viewDidLoad
{
[super viewDidLoad];
[self.vc1 sendMessageToServerWithContent:@"Test"];
}
UPD
你为什么不把你的插座放在一个单独的物体里?使用起来要简单得多。就像:
[[MySpecialSocketManager sharedInstance] sendMessageToServerWithContent:@"Hello, Server!"];
请参见,如何实现调用的
viewVC
的单例,它甚至没有正确创建和初始化。这不是之前屏幕上的视图控制器
1.要调用对象的方法,应首先对其进行正确初始化
viewVC = [[ViewController alloc] init];
您说过,socket
属性在viewDidLoad
方法中初始化。要强制加载视图,如果不打算首先显示视图,请使用loadView
方法
2.如果要使用特定对象,请不要初始化另一个ViewController
。在您的情况下,它应该是显示第二个控制器的控制器
在ViewController.m文件中的某个位置,当第二个视图控制器即将出现时:
ViewController2 *second=[[ViewController2 alloc] init];
second.vc1 = self; // now the second controller has a pointer to original object
[self presentViewController:second ...];
对于segue
-导航
- (void)prepareForSegue:(UIStoryBoardSegue *)segue
{
ViewController2 *second=(ViewController2 *)segue.destinationViewController;
send.vc1 = self;
}
现在在ViewController 2
viewDidLoad
方法中
- (void)viewDidLoad
{
[super viewDidLoad];
[self.vc1 sendMessageToServerWithContent:@"Test"];
}
UPD
你为什么不把你的插座放在一个单独的物体里?使用起来要简单得多。就像:
[[MySpecialSocketManager sharedInstance] sendMessageToServerWithContent:@"Hello, Server!"];
请参阅,如何实现单例您不能像这样初始化对象:
viewVC=[viewcontrolleralloc]代码>
必须将ViewController1的对象传递给ViewController2,即
在viewcontoller1上按ViewContoller2时,您必须编写情节提要删除代码
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
ViewController2 *view2=[segue destinationViewController];
view2.viewVC=self; // pass viewcontoller1 object to viewcontoller2
}
在ViewContoller2中,您将访问viewVC变量中的viewContoller1对象,您可以像这样直接调用它
- (void)viewDidLoad {
[super viewDidLoad];
[viewVC sendMessageToServerWithContent:@"Test"];
//When calling from here, the socket object in ViewController 1 is nil
}
不能像这样初始化对象:viewVC=[viewcontrolleralloc]代码>
必须将ViewController1的对象传递给ViewController2,即
在viewcontoller1上按ViewContoller2时,您必须编写情节提要删除代码
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
ViewController2 *view2=[segue destinationViewController];
view2.viewVC=self; // pass viewcontoller1 object to viewcontoller2
}
在ViewContoller2中,您将访问viewVC变量中的viewContoller1对象,您可以像这样直接调用它
- (void)viewDidLoad {
[super viewDidLoad];
[viewVC sendMessageToServerWithContent:@"Test"];
//When calling from here, the socket object in ViewController 1 is nil
}
当套接字
属性初始化时?尝试先检查发生了什么,socket
初始化或ViewController 2
viewDidLoad
方法。socket=[[SRWebSocket alloc]initWithURLRequest:[NSURLRequest requestWithURL:[nsurlurlwithstring:serverIP_GLOBAL]];这发生在ViewController 1中,然后打开第二个。当套接字
属性初始化时?尝试先检查发生了什么,socket
初始化或ViewController 2
viewDidLoad
方法。socket=[[SRWebSocket alloc]initWithURLRequest:[NSURLRequest requestWithURL:[nsurlurlwithstring:serverIP_GLOBAL]];这发生在打开第二个之前的ViewController 1中。谢谢,我的VC1也不在故事板中,将其包含在故事板中并使用您的答案,它工作正常。谢谢IR工作期待您在我的帖子上投票。正如Girijesh所说,在对象上调用alloc而不是init是无效的(已投票)。在Objective-C中创建对象总是一个两步过程:alloc,然后是init方法。如果不调用init,这是一个错误。一直都是。谢谢,我的VC1也不在故事板中,将其包含在故事板中,并使用您的答案它起作用了。谢谢IR Works期待您在我的帖子上投票。正如Girijesh所说,在对象上调用alloc而不是init是无效的(已投票)。在Objective-C中创建对象总是一个两步过程:alloc,然后是init方法。如果不调用init,这是一个错误。总是