我有一个TabBar布局,在Home选项卡中我有一个按钮“Connect”,按下时会向TransferViewController类发送一个动作以创建一个GameKit Session。然后我有另一个名为Send的标签,其中有一个按钮,上面写着“发送文件”,当按下该按钮时,会向TransferViewController类发送一个动作,该类使用了使用connect设置的“Session”变量来发送文件,但由于它是一个不同的选项卡它会创建一个新的Controller实例,它希望我再次连接,但按钮位于主页选项卡上。
无论如何,我可以为两个标签设置一个Controller而不需要两个实例吗?我希望用户单击“主页”选项卡上的“连接”,然后切换到“发送”选项卡,然后按“发送文件”,并使用另一个选项卡上的“连接”设置变量。如果这令人困惑,我很抱歉。
答案 0 :(得分:2)
这根本不会让人感到困惑 - 实际上,这种情况一直存在。它在模型 - 视图 - 控制器系统中的工作方式是,您可以设置模型类,使其成为单例,并在需要共享数据的所有控制器中添加对该单例的引用。
Model.h
@interface Model : NSObject
@property (nonatomic, readwrite) Session *session;
-(id)init;
+(Model*)instance;
@end
Model.m
@implementation Model
@synthesize isMultiplayer;
-(id)init {
if(self=[super init]) {
self.session = ...; // Get the session
}
return self;
}
+(Model*)instance {
static dispatch_once_t once;
static Model *sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
@end
现在,您可以在控制器代码中使用共享会话:import "Model.h"
,然后编写
[[Model instance].session connect];
[[Model instance].session sendAction:myAction];