How do I change names programmatically to tell apart UIViews in Xcode visual debugger?
How do I rename views in Xcode visual debugger? It's a sea of UIViews so it's nearly impossible to tell which uiview a constraint is for.
UIViewControllers show titles while for UIViews unless it's a derived class it's UIView. How do you tell them apart?
Case to the point
this seems to be a duplicate of How to set the Identifier of a UIView in Xcode 4.5/iOS for debugging auto layout?
Solution 1:
Control-click the view in question and choose Print Description in the contextual menu:
<UIView: 0x7fbec8508420; frame = (30 34; 163 117); autoresize = RM+BM;
layer = <CALayer: 0x6000019c65c0>>
Often that will be enough to identify the view. If it isn't, you can ask the view questions, though the syntax is a little tricky:
(lldb) expr -l objc -O -- [(UIView*)0x7fbec8508420 backgroundColor]
<UIDynamicModifiedColor: 0x6000017c6f10; contrast = normal,
baseColor = <UIDynamicSystemColor: 0x6000019c6600; name = systemYellowColor>>
Another trick I sometimes use is to give the view an identifier. A little-known trick is that a layer has a name
that you can use as you like. And a view has a layer. So I declare an extension:
extension UIView {
@objc var name : String? { return layer.name }
}
Now you can ask the view for its name
. You can assign the name in code or (using runtime attributes) in the storyboard.
My technique for giving a view a name and seeing it in the view debugger has a evolved a bit since I originally gave this answer, so I want to show what it looks like now:
extension UIView {
@objc var debugName: String {
get { layer.name ?? "" }
set { layer.name = newValue }
}
open override var debugDescription: String {
var proposedDescription = description
if !debugName.isEmpty {
proposedDescription.insert(
contentsOf: "; name = '\(debugName)'",
at: proposedDescription.index(proposedDescription.endIndex, offsetBy: -1)
)
}
return proposedDescription
}
}
The reason this is cool is that the debug name is shown automatically in the Xcode console during view debugging when you Print Description. I can't begin to describe how useful that is. Together with constraint identifiers, you can easily work out exactly what's going on.