我从NSObject创建了一个继承“Datetool”的类来记录应用程序启动的日期。但我需要在AppDelegate中显示startTime字符串。
我尝试使用Block发送带有'AppDelegate.h'中声明的变量的字符串,但是,我无法在Datetool的方法initialize
中获取它。
Datetool.m
static NSString *startTime2;
+(void)initialize
{
if (self == [DateTool self])
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterMediumStyle];
startTime2 = [formatter stringFromDate:[NSDate date]];
}
}
答案 0 :(得分:0)
为什么不在应用程序启动时简单地在AppDelegate中调用一个函数。(警告我还没有尝试过编译它。)
- (NSString*)getStartDate {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterMediumStyle];
return [formatter stringFromDate:[NSDate date]];
}
答案 1 :(得分:0)
您可以使用UIApplication的单例方法从任何地方访问您的AppDelegate:[UIApplication sharedApplication].delegate
只需将其转换为自定义类即可访问特定方法:(AppDelegate*)[UIApplication sharedApplication].delegate
那就是说,我不认为这是正确的方法。您的Datetool是一个实用程序类,不应该依赖于对AppDelegate的引用,这会使代码紧密耦合。相反,应该能够从AppDelegate调用Datetool并返回所需的值。由于您已经在使用类方法,因此看起来Datetool根本不需要实例。您可以废弃存储静态值并返回所需内容:
+ (NSString*)startTime
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterMediumStyle];
return [formatter stringFromDate:[NSDate date]];
}
现在你从工具中提取一个值,而不是试图将它推到AppDelegate上,这使得它可以用于其他目的。
答案 2 :(得分:0)
将类定义导入AppDelegate.h并在AppDelegate中实例化对象是不是一个坏主意?
答案 3 :(得分:0)
我建议您在DateTool中提供由AppDelegate实现的委托协议。例如(未测试):
DateTool.h:
/** The delegate protocol of DateTool. */
@protocol DateToolDelegate <NSObject>
/** The start date was set. */
- (void)startDateSet:(NSDate)startDate;
@end
@interface DateTool : NSObject
/** The delegate of DateTool. */
@property (weak) id<DateToolDelegate> delegate;
@end
DateTool.m:
+(void)initialize
{
if (self == [DateTool self])
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterMediumStyle];
startTime2 = [formatter stringFromDate:[NSDate date]];
if ([_delegate conformsToProtocol:@protocol(DateToolDelegate)]) {
[_delegate startDateSet:startTime2];
}
}
}
在AppDelegate.h中,您需要添加协议:
#import "DateTool.h"
@interface AppDelegate : UIResponder <DateToolDelegate>
在AppDelegate.m中,您需要将自己注册为委托:
...
dateTool.delegate = self;
...
并实施协议:
- (void)startDateSet:(NSDate)startDate
{
// Do something with startDate
}
希望有所帮助。
PS:为什么要初始化一个类方法?我建议实例化一个对象。