2013-06-30 5 views
1

Я сейчас строил NSMutableArray в Класс A.m в пределах ViewDidLoad Метод.Где я могу реализовать этот массив?

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //Question Array Setup and Alloc 
    stratToolsDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:countButton,@"count",camerButton,@"camera",videoButton,@"video",textButton,@"text",probeButton,@"probe", nil]; 
    stratTools = [[NSMutableArray alloc] initWithObjects:@"Tools",stratToolsDict, nil]; 
    stratObjectsDict = [[NSMutableDictionary alloc]initWithObjectsAndKeys:stratTools,@"Strat1",stratTools,@"Strat2",stratTools,@"Strat3",stratTools,@"Strat4", nil]; 
    stratObjects = [[NSMutableArray alloc]initWithObjects:@"Strategies:",stratObjectsDict,nil]; 
    QuestionDict = [[NSMutableDictionary alloc]initWithObjectsAndKeys:stratObjects,@"Question 1?",stratObjects,@"Question 2?",stratObjects,@"Question 3?",stratObjects,@"Question 4?",stratObjects,@"Question 5?", nil]; 


    //add strategys to questions 
    QuestionsList = [[NSMutableArray alloc]init]; 
    for (int i = 0; i < 1; i++) { 
     [QuestionsList addObject:QuestionDict]; 
    } 
    NSLog(@"Object: %@",QuestionsList); 

В конце этого метода вы увидите QuestionsList инициализации и теперь мне нужно отправить этот Array к класса B.

Поэтому я поместил его и getters с использованием методов @property и @Synthesize. Класс А

@property (retain, nonatomic) NSMutableDictionary *stratToolsDict; 
@property (retain, nonatomic) NSMutableArray *stratTools; 
@property (retain, nonatomic) NSMutableArray *stratObjects; 
@property (retain, nonatomic) NSMutableDictionary *QuestionDict; 
@property (retain, nonatomic) NSMutableArray *QuestionsList; 

Класс Am

@synthesize QuestionDict; 
@synthesize stratToolsDict; 
@synthesize stratObjects; 
@synthesize stratTools; 
@synthesize QuestionsList; 

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

Я затем добавить @property и @class для класса А к класса B.h, а также объявить NSMutableArray в @interface.

#import "Class A.h" 

    @class Class A; 

    @interface Class B : UITableViewController<UITableViewDataSource, UITableViewDelegate>{ 
     NSMutableArray *QuestionList; 
     Class A *arrayQuestions; 
     } 

    @property Class A *arrayQuestions; 

Тогда я называю NSMutableArray из класса А в класс B.m

-(id)initWithStyle:(UITableViewStyle)style 
{ 
    if ([super initWithStyle:style] != nil) { 

     //Make array 
     arrayQuestions = [[Class A alloc]init]; 
     QuestionList = arrayQuestions.QuestionsList; 

Сразу после этого я Регистрирует NSMutableArray для просмотра значений и убедитесь, что они есть, и она возвращает NIL.

//Log test 
NSLog(@"QuestionList init method: %@",QuestionList); 

Информация о Класс B - Класс B является UIPopOverController для класса А, Класс B имеет один вид, который держит UITableView, который я должен заполнить результаты класса А-хNSMutableArray.

Почему NsMutableArray возвращается как NIL? В конечном итоге мне хотелось бы помочь понять, как это сделать, похоже, меня действительно смущает. Помощь с благодарностью!

+0

Ваша ошибка в том, что вы можете выделить/инициализировать экземпляр класса, и он чудесным образом получит доступ к значениям в других экземплярах этого класса. –

+0

Должен ли я использовать метод singleton для решения этого? по какой-то причине это действительно меня озадачило. @HotLicks – Keeano

+2

@KeeanoMartin Singletons не решает проблемы, они создают глобальное состояние. – CodaFi

ответ

1

Чтобы ответить на ваш первый вопрос, у вас есть свойство NIL «неожиданно», потому что то, что вы делаете, создает экземпляр невидимой версии вашего класса B, даже если ваш новый фрейм XIB/раскадровки уже отображается в другой части памяти.

Если вы используете раскадровки, я бы рекомендовал воспользоваться методом prepareForSegue, вызванным @HotLicks. Лично мне нравится this answer для передачи данных вперед и назад между диспетчерами.

Если вы НЕ используете раскадровки, вам нужно будет вручную нажимать новый XIB, чтобы получить данные от A до B объектно-ориентированным образом.

Одноэлементный экземпляр, безусловно, позаботится об этой проблеме, хотя с объектно-ориентированной точки зрения пуриона он нахмурился. Если вы спуститесь по этому маршруту, вам нужно убедиться, что вы используете dispatch_once, и у вас будет потенциал для просмотра контроллеров, которые будут заново создавать ваши полезные данные.

Есть и другие способы, но это должно помочь получить мяч. Удачи.

+0

Спасибо, что ответили на это за меня, я не использую StoryBoards. Так что я должен просто пойти по пути настройки и получения ценности? Как и в большинстве объектно-ориентированных языков. Но использование метода singleton приведет к глобальным переменным, к которым можно получить доступ, и мы не хотим этого ..... Правильно? – Keeano

+0

Это зависит от «мы». Я буду использовать их для сложных классов данных, но в конечном итоге это зависит от вас. Это ваш код :) – Dan

+0

Хорошо, это правда, хаха Спасибо! Я попробовал метод singleton, но я все еще получаю ответ NIL .... Если бы я открыл shat, вы бы мне помогли? – Keeano

Смежные вопросы