为了学习iOS编程,我正在开发一个用于共享图像的iPhone应用程序。该应用程序是网站的客户端。
在方法didFinishLaunchingWithOptions
中,我检查用户是否已登录。
如果用户没有登录,他仍然可以看到应用程序的所有部分,但是例如他不会看到用于编辑个人资料,评论图像等的选项按钮。
如何在所有视图控制器中共享已记录/未记录状态?
答案 0 :(得分:5)
更新:如果今天提出这个建议,我会说使用共享实例:
@interface SomeClass: NSObject
{
+(SomeClass *)shared;
}
@implementation SomeClass
{
+(SomeClass *)shared {
static SomeClass *shared;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [SomeClass new];
});
return shared;
}
}
然后在首次使用时为您自动实例化,并在整个应用中提供:
[[SomeClass shared] doSomething];
您可以使用单例 - 对象的全局共享实例。
@interface SomeClassSingleton : NSObject {
}
+(SomeClass*)sharedSomeClass;
+(void)setSharedSomeClass:(SomeClass*)someObject;
@end
@implementation SomeClassSingleton
static SomeClass* _someObject = nil;
+(SomeClass*)sharedSomeClass
{
return _someObject;
}
+(void)setSharedSomeClass:(SomeClass*)someObject
{
@syncrhonized(self)
{
_someObject = someObject;
}
}
@end
然后,当您需要在另一个源文件中访问您的对象时,您可以在其他标题中导入单例的头文件,就像您对任何其他引用一样。
创建一个单身人士:
SomeClass* someObject = [[SomeClass alloc] init];
[SomeClassSingleton setSharedSomeClass:someObject]; // write to save your singleton
使用/阅读单身人士:
[[SomeClass sharedSomeClass] someSharedClassMessage];
// OR
SomeClass* someObject = [SomeClass sharedSomeClass];
或者,您可以创建一个单例实现,在您第一次访问它时自动执行:
@implementation SomeClassSingleton
static SomeClass* _someObject = nil;
+(SomeClass*)sharedSomeClass
{
@synchronized(self) {
if (_someObject == nil) {
_someObject = [[SomeClass alloc] init];
}
}
return _someObject;
}
@end
答案 1 :(得分:1)
将它放在像应用程序委托一样的单例中,或者作为模型对象中的瞬态值(如用户数据),一切都可以看到。
如果将已分配的BOOL属性添加到应用程序委托,则可以这样执行:
myApplicationDelegate *myDelegate = (myApplicationDelegate*)[[UIApplication sharedApplication] delegate];
myDelegate.userLoggedIn = YES;