我已经搜索了这个问题的答案,但是唉,我来了。据我所知,NSDateFormatter
对象的创建成本很高,我不想为表格内的每个NSTextField
实例化一个对象。我面临的问题是我的表是基于视图的(而不是基于单元格的),并且在尝试连接日期格式化程序的共享实例时,我得到黄色警告符号和此消息:
不支持的配置:'文本字段单元格的出口'格式化程序' - 表格视图单元格'连接到'日期格式化程序',无效 destination(基于视图的表视图中的对象可能只是 连接到表视图的委托。)
该警告的问题是:上面引用的“日期格式化程序”是“文件所有者”的属性,它也恰好是NSTableView
的委托。我在这里遗漏了什么,或者我是否必须为表格中每个与日期相关的文本字段创建格式化程序?
答案 0 :(得分:3)
您可以以编程方式而不是xib文件中附加共享格式化程序。在用于返回单元格视图的委托方法中,假设您的单元格类为MyCellView
且MyCellView
具有属性theTextField
,并且视图是从名为{{的xib文件加载的1}}:
MyCellView.xib
然后你需要这个- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
MyCellView *result = [tableView makeViewWithIdentifier:@"MyCellView" owner:self];
[result.theTextField setFormatter:[[self class] sharedFormatter]];
return result;
}
方法。 sharedFormatter
方法将设置一个懒惰的初始化单例。这是iOS和Mac OS X开发中非常常见的模式,如果您以前没有看过它,这是一个很好的学习方法:
sharedFormatter
因此+ (NSFormatter *)sharedFormatter {
static NSFormatter *formatter;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
formatter = [[NSFormatter alloc] init];
/* Set up the formatter's attributes here */
});
return formatter;
}
最多初始化其静态sharedFormatter
变量一次(第一次调用formatter
方法)。 sharedFormatter
导致其输入块中的所有代码只执行一次,甚至负责同步多个线程上发生的调用(尽管我怀疑你是从多个线程调用dispatch_once
)
答案 1 :(得分:1)
你不应该为每个与日期相关的文本字段创建格式化。使用Singleton可以解决它。
将此代码添加到viewController
+ (NSDateFormatter *)sharedDateFormatter
{
NSLog(@"%s",__func__);
static dispatch_once_t once;
static NSDateFormatter * _sharedDateFormatter;
dispatch_once(&once, ^{
_sharedDateFormatter = [[NSDateFormatter alloc] init];
});
return _sharedDateFormatter;
}
,然后您可以像这样访问NSDateFormatter实例:
[[self class] sharedDateFormatter],or ['Your ViewController class ' sharedDateFormatter]
您可以在与日期相关的文本字段中添加属性,调用此方法将NSDateFormatter实例设置为文本字段:
yourTextField.dateFormatter = ['Your ViewController class ' sharedDateFormatter];
它只会创建一个NSDateFormatter实例,如果你不明白,请阅读: