Подтвердить что ты не робот

Как печатать иерархию управления в Cocoa?

У углерода была полезная функция под названием DebugPrintControlHierarchy.

Есть ли что-то подобное для NSView или NSWindow?

4b9b3361

Ответ 1

Я не знаю, что именно напечатано DebugPrintControlHierarchy, но NSView имеет полезный вызов метода _subtreeDescription, который возвращает строку, описывающую всю иерархию под приемником, включая классы, фреймы и другую полезную информацию.

Не бойтесь ведущего подчеркивания _. Это не общедоступный API, но он санкционирован для публичного использования в gdb. Вы можете увидеть, как он упоминал в примечаниях к выпуску AppKit вместе с некоторыми выходными выводами.

Ответ 2

Здесь кишки категории 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]; и посмотрите, как он идет.

Ответ 3

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()