     }
     
     /// super.detailTextLabel returns nil even though super.textLabel returns the label, so resorting to subviews:
-    private var inheritedDetailTextLabel: UILabel? {
-        let superLabels = super.contentView.subviews.filter { $0 is UILabel } as! [UILabel]
-        let superLabel: UILabel? = super.detailTextLabel
-            ?? (
-                superLabels.count == 2
-                    ? superLabels[1]
-                    : nil
-        )
-        return superLabel
+    private var superDetailTextLabel: UILabel? {
+        IBLog.write("superDetailTextLabel {", indent: 1)
+        let label: UILabel?
+        if let detailTextLabel = super.detailTextLabel {
+            IBLog.write("return super.detailTextLabel")
+            IBLog.write("}", indent: -1)
+            label = detailTextLabel
+        } else {
+            let superLabels = super.contentView.subviews.filter { $0 is UILabel } as! [UILabel]
+            IBLog.write("return super.contentView.subviews labels[1]:")
+            label = superLabels.count == 2
+                ? superLabels[1]
+                : nil
+        }
+        IBLog.write("label: \(label.shortDescription)")
+        IBLog.write("}", indent: -1)
+        return label
     }
     
     // #endif // TARGET_INTERFACE_BUILDER
     
     open override func prepareForInterfaceBuilder() {
+        IBLog.write("prepareForInterfaceBuilder() {", indent: 1)
         super.prepareForInterfaceBuilder()
         if let destination = overridingTextLabel,
             let source = super.textLabel

            source.image = nil
        }
        isFinishedPrepare = true
    }
    
    /*
    open override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        overridingTextLabel?.copyNonDefaultProperties(from: dumpTextLabel)
        overridingDetailTextLabel?.copyNonDefaultProperties(from: dumpDetailTextLabel)
        overridingImageView?.copyNonDefaultProperties(from: dumpImageView)
        super.textLabel?.removeFromSuperview()
        dumpTextLabel.removeFromSuperview()
        dumpDetailTextLabel.removeFromSuperview()
        dumpImageView.removeFromSuperview()
        removePlaceholders()
        isFinishedPrepare = true
    }
    
    open override func layoutSubviews() {
        IBLog.write("layoutSubviews() {", indent: 1)
        super.layoutSubviews()
        offsetSubviewFramesIfNeeded()
        IBLog.write("}", indent: -1)
    }
    
    /// Implement workaround for bug in IB frames of textLabel, detailTextLabel, imageView.
    private var isOffsetSubviewFramesNeeded = true
    
    // Hack to figure out in which layoutSubviews() call after prepareForInterfaceBuilder, to adjust the frames so the selection in IB lines up.
    private var offsetCount = 0
    private let changeFrameOffsetCount = 3
    
    /// Workaround for bug in IB that does not show the correct frame for textLabel etc.
    private func offsetSubviewFramesIfNeeded() {

        IBLog.write("offsetSubviewFramesIfNeeded() {", indent: 1)
        offsetCount += 1
        IBLog.write("offsetCount = \(offsetCount)")
        if offsetCount == changeFrameOffsetCount {
            [textLabel, detailTextLabel, imageView].compactMap { $0 }.forEach { subview in
                let converted = subview.convert(CGPoint.zero, to: self)
                if converted.x > 0
                    && converted.y > 0
                {
                    IBLog.write("subview: \(subview.shortDescription) {", indent: 1)
                    IBLog.write("old origin: \(subview.frame.origin)")
                    subview.frame.origin = converted
                    IBLog.write("new origin: \(subview.frame.origin)")
                    IBLog.write("}", indent: -1)
                }
            }
            isOffsetSubviewFramesFinished = true
        }
        IBLog.write("}", indent: -1)
    }
    
    #endif // TARGET_INTERFACE_BUILDER
    
