Где я могу создать глобальные переменные для приложения для iOS? - PullRequest
1 голос
/ 07 марта 2012

Вот мой код:

Я хочу иметь возможность создать глобальный NSMutableArray, который может хранить объекты Budget *, которые затем могут быть записаны в файл .pList ... Я только изучаю, что такое pLists, и немного неуверен в том, как реализовать их ...

Где я здесь не так?

- (IBAction)btnCreateBudget:(id)sender 
{
    Budget *budget = [[Budget alloc] init];

    budget.name = self.txtFldBudgetName.text;
    budget.amount = [self.txtFldBudgetAmount.text intValue];    

    // Write the data to the pList
    NSMutableArray *anArray = [[NSMutableArray alloc] init]; // I want this to be a global variable for the entire app. Where do I put this?

    [anArray addObject:budget];

    [anArray writeToFile:[self dataFilePath] atomically:YES];

    /* As you can see, below is where I test the code. Unfortunately, 
    every time I run this, I get only 1 element in the array. I'm assuming 
    that this is because everytime the button is pressed, I create a brand new 
    NSMutableArray *anArray. I want that to be global for the entire app. */

    int i = 0;
    for (Budget * b in anArray)
    {
        i++;
    }
    NSLog(@"There are %d items in anArray",i);

}

-(NSString *) dataFilePath
{ 
    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentDirectory = [path objectAtIndex:0]; 
    return [documentDirectory stringByAppendingPathComponent:@"BudgetData.plist"];
}

edit: Я хотел бы добавить, что я создаю массив anArray, чтобы он был доступен для других представлений. Я так понимаю, что это можно сделать с помощью NSNotification? или я должен сделать это классы appDelegate? Конечная цель состоит в том, чтобы объект anArray заполнил UITableView, который находится в отдельном представлении.

Ответы [ 4 ]

3 голосов
/ 07 марта 2012

Просто поместите объявление вне метода, а не внутри него.

NSMutableArray *anArray = nil;

- (IBAction)btnCreateBudget:(id)sender 
{
    ...
    if ( anArray == nil )
      anArray = [[NSMutableArray alloc] init]; 
    ...
}

Если он используется только внутри одного файла, вместо этого сделайте его «статическим», чтобы предотвратить конфликт имен с другими файлами:

    static NSMutableArray *anArray = nil;

Если он используется только внутри одного метода, сделайте его «статическим» и поместите его в этот метод:

- (IBAction)btnCreateBudget:(id)sender 
{
    static NSMutableArray *anArray = nil;
    ...
    if ( anArray == nil )
      anArray = [[NSMutableArray alloc] init]; 
    ...
}

Обратите внимание, что люди обычно используют какое-то соглашение об именах для глобальных переменных, такое как "gArray", чтобы легко отличать их от локальных переменных, переменных экземпляра или параметров метода.

2 голосов
/ 07 марта 2012

В этом случае глобальная переменная не требуется.Вы можете сделать что-то вроде этого:

  1. Считать старые данные в изменяемый массив (initWithContentsOfFile:).
  2. Добавить новую запись в массив.
  3. Сохранить массивв тот же файл.

Но вторая проблема в вашем коде заключается в том, что если ваш класс Budget не является типом списка свойств (объекты NSString, NSData, NSArray или NSDictionary), writeToFile: не сохранит егоуспешно.

1 голос
/ 07 марта 2012

Необходимо убедиться, что ваш класс Budget вызывает NSCoder, а затем методы NSCoder initWithCoder: и NSCoder decodeWithCoder:.В противном случае writeToFile: не будет работать для вас NSObject класс.

Но я отвлекся.Ответ на исходный вопрос должен быть следующим.

В вашем файле .h вам нужно сделать следующее.

@interface WhateverClassName : UIViewController 
{
    NSMutableArray *anArray;

}

@property(nonatomic, retain) NSMutableArray *anArray;
@end

Затем вам необходимо убедиться, что вы @synthesizeNSMutableArray, чтобы вы не получили никаких причудливых предупреждений.Это делается сразу после строки @implementation в вашем файле .m.

Затем, внутри функции, которую вы хотите разместить в памяти, просто выполните следующее.

anArray = [[NSMutableArray alloc] initWithObjects:nil];

Теперь это переменная global.Это global в том смысле, что его можно использовать из любой функции, и оно не ограничено использованием в одной функции.

0 голосов
/ 07 марта 2012

Если вы хотите, чтобы данные были доступны для всего приложения или контекста («глобального»), вы можете использовать одиночный код. Однако делайте это с осторожностью и убедитесь, что это действительно необходимо и уместно. Я бы посоветовал много почитать об этом до любой реализации синглтона. Картер Аллен имеет хорошую базовую реализацию здесь .

В соответствии с «Конечная цель состоит в том, чтобы объект anArray заполнял UITableView, который находится в отдельном представлении», вам не нужно ничего записывать в файл, базу данных или синглтон. Просто установите объект. Как сказал Себастьен Пик.

Если вы хотите хранить данные в автономном режиме, изучите sqlite, json, plist и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...