是否有任何類型的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