2014-03-02 44 views
2

我已经搜索了高和低的答案,但唉,我在这里。因为我知道NSDateFormatter对象的创建成本很高,所以我不想为我的表格中的每个NSTextField实例化一个对象。我面对的问题是我的表是基于视图(而不是基于单元格),并且当试图连接日期格式化程序的共享实例时,我会看到黄色警告符号和此消息:在基于视图的NSTableView中的NSTextFields之间共享NSDateFormatter?

不支持的配置:“文本字段细胞 - 表视图细胞”的出口“格式化”被连接到“日期格式化,”无效 目的地(对象内视图基于表视图可以仅 连接到表视图的代表。 )

该警告的问题是这样的:上面引用的“日期格式化程序”是“文件的所有者,“这也恰好是NSTableView的代表。我在这里错过了什么,或者我将不得不为表中的每个与日期相关的文本字段创建格式化程序?

回答

3

您可以在厦门国际银行文件附加共享格式化程序代替。在返回单元格的视图的委托方法,假设你的类是MyCellViewMyCellView有一个属性theTextField,视图是由名为MyCellView.xib一个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方法。 sharedFormatter方法将设置一个懒惰的初始化单例。这是在iOS和Mac OS X的开发一个很常见的模式,它是学习,如果你以前没有见过一个好的:

+ (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会导致其输入块中的所有代码只执行一次,甚至会照顾同步多线程中发生的调用(尽管我怀疑你会从多个线程调用sharedFormatter)。

+0

感谢您的详细回复!实际上,这几乎完全是我发布后尝试做的。唯一的区别是,我没有使用'dispatch_once'调用来使用实例方法,而不是类方法。我会用我最新的“问题”更新我的问题。 –

+0

划伤我刚才说的一切。有效。我有一个日期格式问题。一切都会破坏一切。再次感谢。 –

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]; 

it wi会只有一个创造NSDateFormatter例如,如果你不`吨明白,请仔细阅读本:

Create singleton using GCD's dispatch_once in Objective C

+0

感谢您的回复。我实现了类格式化程序,但是我仍然没有在单元格中输出。这只是空白。有任何想法吗?附:看到我更新的问题,看看我在哪里。 –

+0

编辑:我想通了。尽管感谢您的回复。 –

相关问题