公认的解决方案是正确的,但当数据在两个以上的 segue 之间共享时,我经常使用另一种方法。我经常创建一个单例类(我们称之为 APPSession)并将它用作数据模型,创建和维护一个类似会话的结构,我可以在代码中的任何地方进行读写。
对于复杂的应用程序,这个解决方案可能需要太多容易出错的编码,但我已经在很多不同的场合成功地使用了它。
APPSession.m
//
// APPSession.m
//
// Created by Luca Adamo on 09/07/12.
// Copyright 2012 ELbuild. All rights reserved.
//
#import "APPSession.h"
@implementation APPSession
@synthesize myProperty;
static APPSession *instance = nil;
// Get the shared instance and create it if necessary.
+ (APPSession *)instance {
if (instance == nil) {
instance = [[super allocWithZone:NULL] init];
}
return instance;
}
// Private init, it will be called once the first time the singleton is created
- (id)init
{
self = [super init];
if (self) {
// Standard init code goes here
}
return self;
}
// This will never be called since the singleton will survive until the app is finished. We keep it for coherence.
-(void)dealloc
{
}
// Avoid new allocations
+ (id)allocWithZone:(NSZone*)zone {
return [self sharedInstance];
}
// Avoid to create multiple copies of the singleton.
- (id)copyWithZone:(NSZone *)zone {
return self;
}
APPSession.h
//
// APPSession.h
//
// Created by Luca Adamo on 09/07/12.
// Copyright 2012 ELbuild. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface APPSession : NSObject{
}
@property(nonatomic,retain) NSString* myProperty;
+ (id)sharedInstance;
@end
如何从应用程序代码的每个部分读取和写入属性myProperty 。
// How to write "MyValue" to myProperty NSString *
[APPSession instance] setMyProperty:@"myValue"]
// How to read myProperty
NSString * myVCNewProperty = [[APPSession instance] myProperty];
使用这种机制,我可以安全地在第一个 ViewController 中的 APPSession 中写入一个值,对第二个 ViewController 执行 segue,对第三个执行另一个 segue 并使用在第一个 segue 期间写入的变量。
它或多或少类似于 Java EE 中的 SessionScoped JavaBean。请随时指出这种方法中的问题。