2015-04-17 61 views
0

我正在尝试编写一个应该显示一些数据的应用程序。有问题的数据来自我们的代码中的不同模块(用C编写,而不是ObjC),并且由于各种原因由字符串标识,而不是整数或其他形式的常量。胶水代码后,我有一个像这样在我的AppDelegate传入方法:按字符串在NIB内搜索NSView

-(void)newstringdata:(NSString*)data withLabel:(NSString*)label; 

此方法应始终以data值,并将其设置为文本在UI中的特定标签。问题是,哪个标签。

我当然可以创建一个NSDictionary并在运行时用方法中的label参数的可能值填充它,并参考插座,但这看起来有点丑陋和低效;它需要我维护网点,笔尖NSDictionary - 初始化代码。

相反,如果可能的话,我想在某处设置界面设计器中的属性,然后根据传递的标签在我的newstringdata:withLabel:方法中进行查找,该标签返回NSLabel

这可能吗?如果是这样,我该怎么做?

+0

如何是你的设计在某种程度上依赖于通过识别标签字符串的看法,当你还没有想出如何标签串分配到的意见,甚至如果你可以的话?也就是说,您展示的方法的调用者在哪里首先获得标签字符串?它如何确定这些标签字符串对应于视图?什么是一组可能的标签字符串?等。 –

+0

我从另一个模块获取数据,该模块通过名称来识别数据,这是一个字符串。这不是我控制的东西;这是我如何获得数据。 –

+0

没错,但是这些数据与你的观点无关。我建议您将数据存储在控制器的字典属性中。然后,通过该属性将视图绑定到控制器,如果有的话,视图有意义的值。也就是说,通过让视图/绑定找到数据来颠倒问题,而不是根据数据找到视图。 –

回答

0

如果label的值永远不会包含斜线(/),反斜线(\)或冒号(:),则可以使用NSView的标识属性。

在xib中,输入每个标签字符串作为NSTextViews的标识符(在“标识”选项卡中,左起第三个标签)。

在你的代码

然后,遍历所有的意见和:

if ([aView.identifier isEqualToString:label]) 
    [aView setStringValue:data]; 
+0

这是有效的,只要我确认我正在循环的aView对象实际上实现了NSUserInterfaceItemIdentification协议,它只有顶级的协议;如果我在窗口和(递归)子视图上调用“子视图”,最终你会得到一个不支持的NSView。 –

+0

好的,然后将第一行改为:if([aView isKindOfClass:[NSTextView class]] && [aView.identifier isEqualToString:label]) –