如何在 Objective-C 中将字符串发送到 AppDelegate?
How do I send the a String to AppDelegate in Objective-C?
我创建了一个 class 'Datetool' 从 NSObject 继承来记录应用程序启动的日期。但我需要在 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]];
}
}
为什么不在应用程序启动时简单地调用 AppDelegate 中的函数。(警告我没有尝试编译它)。
- (NSString*)getStartDate {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterMediumStyle];
return [formatter stringFromDate:[NSDate date]];
}
您可以使用 UIApplication 的单例方法从任何地方访问您的 AppDelegate:[UIApplication sharedApplication].delegate
只需将其转换为您的自定义 class 即可访问特定方法:(AppDelegate*)[UIApplication sharedApplication].delegate
就是说,我认为这不是正确的方法。您的 Datetool 是一个实用程序 class,不应依赖于对 AppDelegate 的引用,这会产生非常紧密耦合的代码。相反,应该能够从 AppDelegate 调用 Datetool 并 return 所需的值。由于您已经在使用 class 方法,因此 Datetool 似乎根本不需要实例。您可以废弃存储静态值,仅 return 您需要的内容:
+ (NSString*)startTime
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterMediumStyle];
return [formatter stringFromDate:[NSDate date]];
}
现在您正在从工具中提取一个值,而不是尝试将其推送到 AppDelegate,这使得它可以重复用于其他目的。
将 class 定义导入 AppDelegate.h 并在 AppDelegate 中实例化对象是否是个坏主意?
我建议您在 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: 为什么要初始化一个class方法?我建议实例化一个对象。
我创建了一个 class 'Datetool' 从 NSObject 继承来记录应用程序启动的日期。但我需要在 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]];
}
}
为什么不在应用程序启动时简单地调用 AppDelegate 中的函数。(警告我没有尝试编译它)。
- (NSString*)getStartDate {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterMediumStyle];
return [formatter stringFromDate:[NSDate date]];
}
您可以使用 UIApplication 的单例方法从任何地方访问您的 AppDelegate:[UIApplication sharedApplication].delegate
只需将其转换为您的自定义 class 即可访问特定方法:(AppDelegate*)[UIApplication sharedApplication].delegate
就是说,我认为这不是正确的方法。您的 Datetool 是一个实用程序 class,不应依赖于对 AppDelegate 的引用,这会产生非常紧密耦合的代码。相反,应该能够从 AppDelegate 调用 Datetool 并 return 所需的值。由于您已经在使用 class 方法,因此 Datetool 似乎根本不需要实例。您可以废弃存储静态值,仅 return 您需要的内容:
+ (NSString*)startTime
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterMediumStyle];
return [formatter stringFromDate:[NSDate date]];
}
现在您正在从工具中提取一个值,而不是尝试将其推送到 AppDelegate,这使得它可以重复用于其他目的。
将 class 定义导入 AppDelegate.h 并在 AppDelegate 中实例化对象是否是个坏主意?
我建议您在 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: 为什么要初始化一个class方法?我建议实例化一个对象。