Ios 如何访问其他类中的对象?

Ios 如何访问其他类中的对象?,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&

我想从ViewController 2访问ViewController 1中的函数。这是有效的(通过断点和NSLog输出确认)。但是从ViewController 2调用时,访问ViewController 1中定义的对象是nil

ViewController 1.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.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,这是一个错误。总是