У углерода была полезная функция под названием DebugPrintControlHierarchy.
Есть ли что-то подобное для NSView или NSWindow?
У углерода была полезная функция под названием DebugPrintControlHierarchy.
Есть ли что-то подобное для NSView или NSWindow?
Я не знаю, что именно напечатано DebugPrintControlHierarchy
, но NSView имеет полезный вызов метода _subtreeDescription
, который возвращает строку, описывающую всю иерархию под приемником, включая классы, фреймы и другую полезную информацию.
Не бойтесь ведущего подчеркивания _
. Это не общедоступный API, но он санкционирован для публичного использования в gdb. Вы можете увидеть, как он упоминал в примечаниях к выпуску AppKit вместе с некоторыми выходными выводами.
Здесь кишки категории NSView, которые я построил некоторое время назад:
+ (NSString *)hierarchicalDescriptionOfView:(NSView *)view
level:(NSUInteger)level
{
// Ready the description string for this level
NSMutableString * builtHierarchicalString = [NSMutableString string];
// Build the tab string for the current level indentation
NSMutableString * tabString = [NSMutableString string];
for (NSUInteger i = 0; i <= level; i++)
[tabString appendString:@"\t"];
// Get the view title string if it has one
NSString * titleString = ([view respondsToSelector:@selector(title)]) ? [NSString stringWithFormat:@"%@", [NSString stringWithFormat:@"\"%@\" ", [(NSButton *)view title]]] : @"";
// Append our own description at this level
[builtHierarchicalString appendFormat:@"\n%@<%@: %p> %@(%li subviews)", tabString, [view className], view, titleString, [[view subviews] count]];
// Recurse for each subview ...
for (NSView * subview in [view subviews])
[builtHierarchicalString appendString:[NSView hierarchicalDescriptionOfView:subview
level:(level + 1)]];
return builtHierarchicalString;
}
- (void)logHierarchy
{
NSLog(@"%@", [NSView hierarchicalDescriptionOfView:self
level:0]);
}
Использование
Дампируйте это в категорию NSView, сбросьте это в нем. Включите заголовок категории везде, где вы хотите его использовать, затем вызовите [myView logHierarchy];
и посмотрите, как он идет.
Swift 4.
MacOS
extension NSView {
// Prints results of internal Apple API method `_subtreeDescription` to console.
public func dump() {
Swift.print(perform(Selector(("_subtreeDescription"))))
}
}
IOS
extension UIView {
// Prints results of internal Apple API method `recursiveDescription` to console.
public func dump() {
Swift.print(perform(Selector(("recursiveDescription"))))
}
}
Использование (в отладчике): po myView.dump()