是否有任何类型的ID可以通过Xcode在.nib/.xib中使用和设置,可以在运行时查询以从代码中识别特定的视图实例?NSViews上的唯一ID
特别是当我们的界面中有多个相同NSView子类的副本时,我们如何判断我们目前正在查看哪一个?
是否有任何类型的ID可以通过Xcode在.nib/.xib中使用和设置,可以在运行时查询以从代码中识别特定的视图实例?NSViews上的唯一ID
特别是当我们的界面中有多个相同NSView子类的副本时,我们如何判断我们目前正在查看哪一个?
通用NSView
对象不能在Interface Builder中设置其属性tag
。 NSView
上的tag
方法是只读方法,只能在NSView
的子类中实现。 NSView
未实施setTag:
方法。
我怀疑其他答案指的是NSControl
的实例,它定义了一个-setTag:
方法,并有一个Interface Builder字段允许您设置标签。
你可以用通用视图做的是使用用户定义的运行时属性。这使您可以预先设置视图对象中的属性值。所以,如果您的视图定义的属性,像这样:
@property (strong) NSNumber* viewID;
然后在Interface Builder的身份检查的用户定义属性部分,您可以添加一个属性与的keyPath viewID
,类型Number
和值123
。
在您的视图的-awakeFromNib
方法中,您可以访问该属性的值。您会发现在上面的示例中,您的视图的viewID
属性已预先设置为123
。
在Interface Builder中,有一种方法可以设置NSView的“标识符”。在这种情况下,我将使用标识符“54321”作为标识符字符串。
NSView符合NSUserInterfaceItemIdentification Protocol,它是作为NSString的唯一标识符。您可以遍历视图层次结构并使用该标识符查找NSView。
因此,要建立对这个职位有关获取NSViews,Get ALL views and subview of NSWindow的列表,然后你可以找到一个NSView你想要的标识:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSView *viewToFind = [self viewWithIdentifier:@"54321"];
}
- (NSView *)viewWithIdentifier:(NSString *)identifier
{
NSArray *subviews = [self allSubviewsInView:self.window.contentView];
for (NSView *view in subviews) {
if ([view.identifier isEqualToString:identifier]) {
return view;
}
}
return nil;
}
- (NSMutableArray *)allSubviewsInView:(NSView *)parentView {
NSMutableArray *allSubviews = [[NSMutableArray alloc] initWithObjects: nil];
NSMutableArray *currentSubviews = [[NSMutableArray alloc] initWithObjects: parentView, nil];
NSMutableArray *newSubviews = [[NSMutableArray alloc] initWithObjects: parentView, nil];
while (newSubviews.count) {
[newSubviews removeAllObjects];
for (NSView *view in currentSubviews) {
for (NSView *subview in view.subviews) [newSubviews addObject:subview];
}
[currentSubviews removeAllObjects];
[currentSubviews addObjectsFromArray:newSubviews];
[allSubviews addObjectsFromArray:newSubviews];
}
for (NSView *view in allSubviews) {
NSLog(@"View: %@, tag: %ld, identifier: %@", view, view.tag, view.identifier);
}
return allSubviews;
}
或者,由于您使用的是一个NSView子类,你可以在运行时设置每个视图的“标签”。 (或者,您可以在运行时设置标识符。)有关标记的好处是,有一个预先构建的函数用于查找具有特定标记的视图。
// set the tag
NSInteger tagValue = 12345;
[self.myButton setTag:tagValue];
// find it
NSButton *myButton = [self.window.contentView viewWithTag:12345];
听起来不错,谢谢你的提示!我会尝试的。唉,没有预先定义的香草可可NSView中可以使用,但我想我仍然在考虑PowerPlant/MFC方式太多;-) – Jay
下面的答案适用于通用视图。只需在xib中设置Identifer,然后用view.identifier – Colin
以编程方式访问它。任何想法标签在NSView中只读是什么逻辑? – Mercurial