可可属性网格

时间:2010-01-16 22:00:58

标签: c# objective-c cocoa reflection propertygrid

我没有在Cocoa中找到类似于.NET PropertyGrid类的东西,所以我开始编写自己的版本。 我使用运行时的信息来获取对象的属性:

Class reflectedClass = [reflectedObject class];
uint propertyCount = 0U;
objc_property_t *properties = class_copyPropertyList(reflectedClass, 
                                                     &propertyCount);

这是在NSTableView中获取/设置值:

- (NSString *)propertyNameAtIndex:(int)index
{
    return (NSString *)[cachedPropertyNames objectAtIndex:index];
}

- (id)propertyValueAtIndex:(int)index
{
    return [reflectedObject valueForKey:[self propertyNameAtIndex:index]];
}

- (void)setPropertyValue:(id)value atIndex:(int)index
{
    [reflectedObject setValue:value forKey:[self propertyNameAtIndex:index]];
}

使用reflectedObject同步更新时使用的是基本KVO:

[reflectedObject addObserver:self
                  forKeyPath:propertyName
                     options:NSKeyValueObservingOptionOld | 
                             NSKeyValueObservingOptionNew
                     context:NULL];

此解决方案有效,但我有两个需要解决的问题:

  1. 我需要以某种方式模拟.NET属性,因此我可以为属性选择正确的编辑器。 文本框并不适用于所有情况。
  2. 每行的不同单元格编辑器,对于布尔值复选框,字符串文本框等等。
  3. 我仍然是Cocoa的初学者,很抱歉,如果我要求一些非常基本的东西。

    更新:我需要这样的内容(图片来自Xcode->获取信息 - > Build):

    PropertyGridCocoa http://www.adorior.cz/Images/PropertyGridCocoa.png

1 个答案:

答案 0 :(得分:1)

Cocoa没有内置于框架中的视图。如果没有其他人创建了一个并将其作为开源发布,您将需要从头开始创建一个。

手工制作与底层模型相匹配的UI可能更容易。