Трудность доступа к объектам в другом контроллере представления - PullRequest
0 голосов
/ 22 февраля 2012

Я устанавливаю строку в контроллере представления под названием ViewController и пытаюсь получить к ней доступ где-нибудь еще. Это код:

ViewController.h

NSString *string;

...

@property (retain) NSString *string;

ViewController.m

@synthesize string;

...

-(void)viewDidLoad {

...

string = @"Test";

}

OtherViewController.m

#import "ViewController.h"

...

-(void)viewDidLoad {

    ViewController *vc;
    vc = [[ViewController alloc] init];

    NSLog(@"String: %@", vc.string);

}

Тем не менее, журнал показывает: String: (null). Что я делаю неправильно? Спасибо.

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

viewDidLoad из ViewController вызывается только при загрузке view. view загружается лениво при необходимости, например, когда совершается звонок на vc.view.

Я не уверен, чего вы пытаетесь достичь, но это, конечно, кажется мне запахом кода.

Как указывает @Fscheidl, вы создаете новый экземпляр и не обращаетесь к существующему экземпляру, так что это может усугубить вашу проблему. Я все еще верю, что ваша главная проблема заключается в том, что вы предполагаете, что viewDidLoad вызывается просто путем создания viewController, а это не так

0 голосов
/ 22 февраля 2012

edit: это не обязательно должен быть класс NSObject, если вы хотите, вы также можете сделать это с вашим классом viewController, просто обязательно включите в свой заголовок

-(id)init

---- конец редактирования

если вы пытаетесь создать класс, доступный для другого контроллера представления, почему бы не попробовать NSObject вместо контроллера представления (учитывая, что вам нужно только взятьэто строковое значение)

например, давайте назовем этот класс viewController «глобальным» классом

, поэтому в global.h вы добавите

#import <Foundation/Foundation.h>

@interface GlobalVar : NSObject

@property (nonatomic, strong) NSString *myString;


-(id)init;

@end

, а затем, вglobal.m после этого вы поднимаете

#import "GlobalVar.h"

@implementation GlobalVar

@synthesize myString;

-(id)init
{
    self = [super init];
    if(self)
    {
        myString = [[NSString alloc]initWithFormat:@"the String"];
    }

    return self;
}



@end

, каждый раз, когда вам нужно получить доступ к объекту "myString", содержащемуся в глобальном классе, вы можете поместить

в заголовок:

#import "GlobalVar.h"
...
...
@property (nonatomic, strong) GlobalVar *globalVar;

в файле реализации:

@synthesize globalVar;

...
...

self.globalVar = [[GlobalVar alloc]init];
NSString *theString = globalVar.myString;
NSLog(@"content of my string is : %@",theString);

вот так;)

0 голосов
/ 22 февраля 2012

Вы создаете новый экземпляр ViewController, вызывая [[ViewController alloc] init]; Для этого экземпляра string даже не установлено.Вам необходимо получить доступ к этому точному экземпляру ViewController.

Если вы создаете экземпляр OtherViewController непосредственно из ViewController, вы можете добавить следующее к OtherViewController.h:

#import "ViewController.h"
@property (nonatomic, retain) ViewController *previousViewController

При создании OtherViewController вы можете установить:

//alloc and init instance of OtherViewController
myOtherViewController.previousViewController = self;

В вашем методе viewDidLoad: вы можете получить доступ к вашей строке следующим образом:

NSLog(@"String: %@", previousViewController.string);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...