Передайте переменную между множеством UIVIewControllers - PullRequest
8 голосов
/ 21 октября 2010

В моем приложении для iPhone есть помощник по настройке, который помогает пользователям вводить много данных. Это в основном UINavigationController с большим количеством UIViewController в нем. Теперь, в определенный момент, я хочу получить доступ к переменной, которую пользователь ввел в первый UIViewController, который он увидел. Я мог бы передать переменную между каждым UIViewController с помощью метода установки, но я думаю, что есть более простой способ.

Ответы [ 6 ]

7 голосов
/ 21 октября 2010

Вы можете объявить глобальные или классовые переменные в стиле C, если хотите.Если вы хотите, чтобы одна и та же переменная была доступна в нескольких ваших подклассах UIViewController, вы бы объявили ее как переменную extern в файле .h вашего первого контроллера, например:

#import <UIKit/UIKit.h>

extern NSString *myGlobalString;

@interface MyFirstViewController : UIViewController {
...

Youзатем повторно объявите его в вашем файле .m без extern.

#import "MyFirstViewController.h"

NSString *myGlobalString;

@implementation MyFirstViewController 

Вы не должны повторно объявлять его в других файлах .m или .h, но вы можете получить доступ к переменной во всех импортируемых файлах.MyFirstViewController.h.При установке переменной позаботьтесь о ее освобождении и сохранении.С такой глобальной переменной легко создать утечку памяти.

3 голосов
/ 02 августа 2011

Простой, но многократно используемый и расширяемый способ решения этой проблемы - использование синглтона.

Объявите, например, новый класс с именем SetupConfig.

Ваш SetupConfig.h должен выглядеть следующим образом:

@interface SetupConfig : NSObject {
    NSString *_myString;
}

@property (retain) NSString *myString;

+ (id)sharedSetupConfig;

@end

и соответствующий SetupConfig.m:

#import "SetupConfig.h"

SetupConfig *g_sharedSetupConfig = nil;

@implementation SetupConfig

@synthesize myString = _myString;

+ (id)sharedSetupConfig {
    if (!g_sharedSetupConfig) {
        g_sharedSetupConfig = [[SetupConfig alloc] init];
    }
}

@end

Теперь в реализации контроллера представления вы хотите получить доступ к myString из:

@import "MyViewController.h"
@import "SetupConfig.h"

@implementation MyViewController

- (void)methodDoingSomethingWithSingletonString
{
    NSString *myString = [[SetupConfig sharedSetupConfig] myString];
} 

@end

Одиночный подход имеет ряд преимуществ по сравнению с использованием глобальной переменной C. Прежде всего вам не нужно повторно объявлять ваши глобальные переменные снова и снова. Более того, ваши «глобальные» переменные инкапсулированы в классе. Синтезирование методов получения / установки свойств - хороший способ абстрагировать действительную переменную от остальной части вашего кода. Наконец, эта реализация может быть легко интегрирована в модульные тесты.

3 голосов
/ 21 октября 2010

Да, есть очень простой способ справиться с этим .....

Вы можете взять глобальную переменную

В вашем файле Delegate.h объявите вашу переменную:

@interface Smoke_ApplicationAppDelegate : NSObject <UIApplicationDelegate> {

    UIWindow *window;
    UINavigationController *navigationController;
    NSString *messageString;  //This would be your String Variable

}

@property(nonatomic,retain)NSString *messageString;

Второе в файле Delegate.m

@implementation Smoke_ApplicationAppDelegate

@synthesize window;
@synthesize navigationController;
@synthesize messageString;  // Synthesize it over here..

Готово. Теперь вы можете использовать эту строковую переменную во всех / любых классах, которые вы хотите

Чтобы использовать эту глобальную переменную.

Просто импортируйте ваш делегатский файл сделать объект этого ....

#import "DelegateFile.h"

@implementation About

 DelegateFile *appDel;

Сейчас в вашем классе.

- (void)viewDidLoad {
    [super viewDidLoad];

    appDel=[[UIApplication sharedApplication]delegate];

}

Теперь вы можете получить к нему доступ в любом месте вашего класса с помощью этого объекта:

appDel.messageString

Просто внимательно следуйте моим шагам После того, как так сильно болел мой палец, Я уверен, что это определенно поможет вам .....

легкой жизни,

1 голос
/ 21 октября 2010

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

Синглтон в target-C, Википедия

0 голосов
/ 03 января 2012

Вы можете использовать его как одиночный или оставить его в делегате приложения и вызывать как [appdelegate getstring];

0 голосов
/ 02 августа 2011

Я бы не торопился обойти инкапсуляцию данных, которая является такой хорошей функцией Objective-C.

Если вы собираете что-то, что вы считаете «настройками», подумайте об использовании NSUserDefaults.

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

Если вы действительно хотите одноэлементный маршрут, рассмотрите возможность сделать его свойством делегата приложения (уже существующего одноэлементного)

Помните, что только путь «передачи» данных дает дополнительное преимущество, которое может быть позже, возможно, вам захочется собрать эту стартовую информацию несколько раз и запустить различные возможные последние просмотры, и просто тривиально передать другой. Если вы идете по глобальному маршруту, вам придется начинать переписывать везде, где вы к нему обращались раньше.

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