2015-09-04 4 views
1

Я знаю, что один способ обмена данными - это segue. Но в моем приложении у меня есть несколько вкладок, которые содержат количество VC. Например, userName и address. Я хочу показать в некоторых из VC эту информацию. Каждый раз, когда я запрашиваю облако, это неправильный путь. Я следую за этим ответом первой части: answer. Но как новичок я не уверен, как определяется MyDataModel. Это класс NSObject? Я ценю, если кто-нибудь может определить этот класс как пример с двумя полями NSString. И как получить доступ к этим полям в VC и AppDelegate.Как делиться данными между количеством ViewControllers?

Внутри AppDelegate

@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> 
{ 

    MyDataModel *model; 
    AViewController *aViewController; 
    BViewController *bViewController; 
    ... 
} 

@property (retain) IBOutlet AViewController *aViewController; 
@property (retain) IBOutlet BViewController *aViewController; 

@end 

@implementation MyAppDelegate 

... 

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
... 

    aViewController.model = model; 

    bViewController.model = model; 

    [window addSubview:tabBarController.view]; 
    [window makeKeyAndVisible]; 
} 

Внутри VC:

@interface AViewController : UIViewController { 
    MyDataModel *model; 
} 

@property (nonatomic, retain) MyDataModel *model; 

@end 

@interface BViewController : UIViewController { 
    MyDataModel *model; 
} 

@property (nonatomic, retain) MyDataModel *model; 

@end 

Единственное, что мне нужно где определить MyDataMode и как получить доступ к его полям?

+0

Создайте SubClass из NSObject и в .h файле создайте '@property (неатомный, сохраняющий) NSString * str1;' '@property (неатомный, сохраняющий) NSString * str2;' –

ответ

3

Вы можете использовать одноэлементный класс для того,

---------- 
SharedManages.h 
---------- 

#import <Foundation/Foundation.h> 
#import "Reachability.h" 
#import "Reachability.h" 

@interface SharedManager : NSObject 
{ 

} 
+(SharedManager *)sharedInstance; 

// Create property of your object which you want to access from whole over project. 

@property (retain, nonatomic) User *loginUser; 
@property (assign, readwrite) BOOL isNetAvailable; 

@end 

---------- 

---------- 
SharedManages.m 
---------- 

#import "SharedManager.h" 

static SharedManager *objSharedManager; 

@implementation SharedManager 

@synthesize 
isNetAvailable = _isNetAvailable, 
loginUser = _ loginUser; 

+(SharedManager *)sharedInstance 
{ 
    if(objSharedManager == nil) 
    { 
     objSharedManager = [[SharedManager alloc] init]; 
     objSharedManager. loginUser = [User alloc]] init]; 

     Reachability *r = [Reachability reachabilityForInternetConnection]; 
     NetworkStatus internetStatus = [r currentReachabilityStatus]; 
     // Bool 

     if(internetStatus == NotReachable) 
     { 
      NSLog(@"Internet Disconnected"); 
      objSharedManager.isNetAvailable = NO; // Internet not Connected 
     } 
     else if (internetStatus == ReachableViaWiFi) 
     { 
      NSLog(@"Connected via WIFI"); 
      objSharedManager.isNetAvailable = YES; // Connected via WIFI 
     } 
     else if (internetStatus == ReachableViaWWAN) 
     { 
      NSLog(@"Connected via WWAN"); 
      objSharedManager.isNetAvailable = YES; // Connected via WWAN 
     } 

    } 

    return objSharedManager; 
} 


@end 

Доступ из другого класса ...

[SharedManager sharedInstance].isNetAvailable ; 

[SharedManager sharedInstance].loginUser ; 

Надежда, Это поможет вам ..

+0

Спасибо за ваш ответ. поэтому вы подразумеваете, что SharedManages в моем вопросе равно SharedManages. Мне нужны все эти настройки плюс то, что вы дали здесь или только этот класс? – Bernard

2

У меня нет «локальных» копий значений. Я поставил их в делегат и привел их оттуда. Таким образом, вам не нужно жестко кодировать его для всех UIViewController в делегате.

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

Затем я получаю делегат из VC, вызываю экземпляр и оттуда значения.

Swift

Внутри AppDelegate:

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
    var globals : GlobalValueClass? 

Первый VC:

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let delegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     delegate.globals = GlobalValueClass() 
     delegate.globals!.numbers = [1,2,3] 
    } 
} 

Другое ВК:

class ViewControllerTwo: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let delegate = UIApplication.sharedApplication().delegate as! AppDelegate 

     print(delegate.globals!.numbers) 
     // Do any additional setup after loading the view. 
    } 
} 

Objective C (не полный метод в obj-c, но легко найти)

MainClass *appDelegate = (MainClass *)[[UIApplication sharedApplication] delegate]; 

how to get the delegate in obj-c

1

Самый простой способ я мог думать использует NSUserDefaults. Сохраните name и address строку в NSUserDefaults как

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setValue:YourNameString forKey:@"NameString"]; 
[defaults setValue:YourAddressString forKey:@"AddressString"]; 
[defaults synchronize]; 

и доступ к нему в любом ViewController как

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *name = [plistContent valueForKey:@"NameString"]; 
NSString *address= [plistContent valueForKey:@"AddressString"]; 

Надеется, что это помогает.

0

Вы можете создать класс и использовать его в закладке контроллера.

#import <Foundation/Foundation.h> 



@interface UserModel : NSObject <NSCoding> 

@property (nonatomic, strong) NSString *lastName; 
@property (nonatomic, strong) NSString *firstName; 

+ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict; 
- (instancetype)initWithDictionary:(NSDictionary *)dict; 
- (NSDictionary *)dictionaryRepresentation; 

@end 

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

#import "UserModel.h" 


NSString *const kUserModelLastName = @"LastName"; 
NSString *const kUserModelFirstName = @"FirstName"; 


@interface UserModel() 

- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict; 

@end 

@implementation UserModel 

@synthesize lastName = _lastName; 
@synthesize firstName = _firstName; 


+ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict 
{ 
    return [[self alloc] initWithDictionary:dict]; 
} 

- (instancetype)initWithDictionary:(NSDictionary *)dict 
{ 
    self = [super init]; 

    // This check serves to make sure that a non-NSDictionary object 
    // passed into the model class doesn't break the parsing. 
    if(self && [dict isKindOfClass:[NSDictionary class]]) { 
      self.lastName = [self objectOrNilForKey:kUserModelLastName fromDictionary:dict]; 
      self.firstName = [self objectOrNilForKey:kUserModelFirstName fromDictionary:dict]; 

    } 

    return self; 

} 

- (NSDictionary *)dictionaryRepresentation 
{ 
    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary]; 
    [mutableDict setValue:self.lastName forKey:kUserModelLastName]; 
    [mutableDict setValue:self.firstName forKey:kUserModelFirstName]; 

    return [NSDictionary dictionaryWithDictionary:mutableDict]; 
} 

- (NSString *)description 
{ 
    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]]; 
} 

#pragma mark - Helper Method 
- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict 
{ 
    id object = [dict objectForKey:aKey]; 
    return [object isEqual:[NSNull null]] ? nil : object; 
} 


#pragma mark - NSCoding Methods 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super init]; 

    self.lastName = [aDecoder decodeObjectForKey:kUserModelLastName]; 
    self.firstName = [aDecoder decodeObjectForKey:kUserModelFirstName]; 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 

    [aCoder encodeObject:_lastName forKey:kUserModelLastName]; 
    [aCoder encodeObject:_firstName forKey:kUserModelFirstName]; 
} 

Импорт этот класс, где вы устанавливаете или инициализации данных или значений. и делайте ниже кода.

NSDictionary *dicUserModel = [[NSDictionary alloc]initWithObjectsAndKeys:@"Moure",@"LastName",@"Jackson",@"FirstName", nil]; 

    UserModel *userModel = [[UserModel alloc]initWithDictionary:dicUserModel]; 
    //NSUserDefault save your class with all property. and you can simply retrieve your UserModel from NSUserDefault. 
    //Below code save this model into nsuserdefault. 
    [[NSUserDefaults standardUserDefaults]setObject:[NSKeyedArchiver archivedDataWithRootObject:userModel] forKey:@"UserModel"]; 
    [[NSUserDefaults standardUserDefaults]synchronize]; 

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

UserModel *savedUserModel = (UserModel *)[NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults]objectForKey:@"UserModel"]]; 
    NSLog(@"%@",savedUserModel.firstName); 
    NSLog(@"%@",savedUserModel.lastName); 
Смежные вопросы