Совместное использование строк и переменных в приложении ios - PullRequest
3 голосов
/ 12 декабря 2011

Я делаю приложение для финального проекта для класса, и мне нужно обмениваться строками, целыми числами и числами с плавающей точкой в ​​разных представлениях моего приложения.Я должен создать приложение, которое официант / официантка будет использовать на работе.Мне нужны разные представления для разных типов товаров на заказ (напитки, закуски, закуски и т. Д.), И мне нужно сохранять выбранные товары, цену и количество каждого из них доступными для разных представлений, чтобы в каждом представлении были доступны промежуточные суммы (одно представление для каждого типа элемента) и, наконец, для представления, которое отображает подробный список того, что было заказано, плюс общее количество.

Из того, что я понимаю, я не хотел бы использовать макет приложения панели вкладок, потому что обычнопользователи не ожидают, что информация будет одинаковой между различными представлениями с вкладками, поэтому я подумал об использовании сегментированного контроллера для этого.Чтобы получить строки, целые числа и числа с плавающей точкой, совместно используемые представлениями, можно было бы объявить их в AppDelegate?Я читал, что могу использовать синглтоны, но мы не рассматривали это в моем классе, поэтому я думаю, что это может добавить больше сложности, чем мне нужно.Если бы я объявил их в AppDelegate, пришлось бы мне синтезировать их в AppDelegateViewController.m, чтобы сделать их доступными повсюду?Я не могу представить, что мне придется синтезировать их для каждого отдельного ViewController.Или NSUserDefaults идеально подойдет для этой ситуации?

Если бы я объявил переменную экземпляра в AppDelegate, это по существу сделало бы ее глобальной переменной?Я знаю, что это против практики инкапсуляции, но это не будет иметь большого значения для этого приложения, оно не будет в App Store, и накладные расходы не должны иметь большого значения, учитывая, что это будет относительно небольшое приложение.

Заранее всем спасибо.Удачи вам в финалах, если они все еще приближаются!


Редактировать


Полагаю, я должен сказать, что это будет ужасное, ужасное приложение с битоймы не затронули многие более сложные темы, такие как парадигма MVC для iOS, поэтому я довольно ограничен в том, что я могу сделать по сравнению с тем, что мы должны делать.Глупый класс, я сожалею о том, что подписался на него, когда действительно мог бы сам заняться этим и получить лучшее понимание Objective-C, о котором нас ничему не учили, и лучшее понимание инфраструктуры iOS.

В принципе, если я объявлю переменные в AppDelegate, даже если это ложная ошибка, сработает ли это для доступа к строкам и тому подобному из разных представлений?Или NSUserDefaults будет лучшим решением в этом случае?Я склоняюсь к NSUserDefaults и объявляю их в проектах ViewController.

Ответы [ 5 ]

4 голосов
/ 12 декабря 2011

Типичным решением Objective C MVC является помещение всех связанных строк и переменных в объект Model (создание нового класса для этого объекта) в качестве свойств. Затем поделитесь этим объектом Model со всеми контроллерами, которым необходим доступ к этим переменным или строкам.

Использование AppDelegate в качестве объекта модели является «чрезмерным совместным использованием» и загромождает делегата приложения не связанными с делегированием материалами. Немного более чистое решение состоит в том, чтобы делегат приложения удерживал метод получения объекта Model, который широко используется в приложении. Решение, которое может вызвать проблемы с повторным использованием кода и в противном случае считается политически некорректным, состоит в том, чтобы назначить объект модели и / или сами разделяемые переменные глобальным переменным C (будьте осторожны с сохранением). (Но это обычно генерирует самый быстрый и самый маленький объем кода, если вы заботитесь о таких вещах.)

2 голосов
/ 12 декабря 2011

Как сказал hotpaw2, лучше всего использовать отдельный класс моделей.

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

Если приложение растет, вы, вероятно, захотите переместить модель из делегата приложения в его собственный класс.

Еще более простым и простым способом было бы сохранить этот небольшой объем данных в nsuserdefaults:

сохранить в nsuserdefaults:

[[NSUserDefaults standardUserDefaults] setObject:howManyDrinks forKey:@"howManyDrinks"];
[[NSUserDefaults standardUserDefaults] synchronize];

получить из nsuserdefaults:

NSString *howManyDrinks = [[NSUserDefaults standardUserDefaults] objectForKey:@"howManyDrinks"];
0 голосов
/ 29 декабря 2015

Я пока не эксперт в этом, но я использую синглтон с объектом внутри.Насколько я знаю, значения внутри этого объекта удерживаются.Чтобы создать синглтон, вы должны сделать что-то вроде этого:

Создать обычный объект и добавить его в файл заголовка:

+ (id)sharedManager;

Затем в файле .m добавьте это:

+ (id)sharedManager {
    static SharedInfo *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
    });
    return sharedMyManager;
}
- (id)init {
    if (self = [super init]) {
        self.myStuff = [[NSMutableDictionary alloc]init];
  //This is where you initialise your variables. The example above is for a 
 //property that I have declared in the .h file
    }
    return self;
}

И затем, во всем приложении вы будете использовать это:

[[[SharedInfo sharedManager] myStuff] addObject: SomethingTocreate];

Убедитесь, что вы включили SharedInfo.h в viewcontroller, в котором вы хотите его использовать.

Надеюсь, это помогло.

0 голосов
/ 13 декабря 2011

Вы также можете сохранить эти значения в списке, который затем может быть доступен и отредактирован из любого места в приложении.Это легче реализовать, чем синглтон.А так как вы можете визуально настроить plist в XCode, для начинающих это относительно просто.Я даже создал оболочку для моего списка, чтобы упростить редактирование данных. Вот учебник для списков.

0 голосов
/ 12 декабря 2011

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

...