UIView-NibLoading icon indicating copy to clipboard operation
UIView-NibLoading copied to clipboard

Constraint IBOutlets

Open Codewaves opened this issue 11 years ago • 6 comments

If view class object contains autolayout constraint IBOutlets, they will be set to nil after ARC deallocs nib and initial container view. Quick fix will be something like this:

        NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:firstItem attribute:constraint.firstAttribute relatedBy:constraint.relation toItem:secondItem attribute:constraint.secondAttribute multiplier:constraint.multiplier constant:constraint.constant];
        [self addConstraint:newConstraint];

        // Reconnect outlets
        @autoreleasepool
        {
           unsigned int numberOfProperties = 0;
           objc_property_t *propertyArray = class_copyPropertyList([self class], &numberOfProperties);

           for (NSUInteger i = 0; i < numberOfProperties; i++)
           {
              objc_property_t property = propertyArray[i];
              NSString *name = [[NSString alloc] initWithUTF8String:property_getName(property)];
              id        value = [self valueForKey:name];
              if (value == constraint)
                 [self setValue:newConstraint forKey:name];
           }
           free(propertyArray);
        }

Codewaves avatar Feb 12 '14 08:02 Codewaves

I'm not entirely sure, but hasn't #2 already solved the problem with autolayout in the container ?

n-b avatar Feb 18 '14 21:02 n-b

Hi, I did face the same issue regarding "constraint IBOutlets" today. The solution provided by Codewaves works well. I forked your repository to add the code snipped together with an example view. Are you interested??

meknil avatar Oct 21 '14 23:10 meknil

Maybe. Given #2, constraints should be ported to the new view. Why/when doesn't it work?

n-b avatar Oct 22 '14 09:10 n-b

Yes, the constraints are ported by making a hard copy! If I have a IBOutlet for a constraint (not view) defined then this outlet points to the original constraint. The suggested code above reconnects the defined outlet to the copy of the original constraint.

I use IBOutlet for a constraint to modify its constant property at runtime (or design time). See my example here.

meknil avatar Oct 22 '14 10:10 meknil

Oh, OK. I'd like a solution that doesn't use the objc runtime, will look into it tomorrow. Thanks for the sample code.

n-b avatar Oct 22 '14 21:10 n-b

@meknil See pull request #9. I’d like your feedback on this, as I’m probably not going to use it anytime soon.

Thanks again for the example. I hadn’t had the opportunity to try IB_DESIGNABLE and IBInspectable, it makes NibLoadedView all the more interesting.

n-b avatar Oct 23 '14 19:10 n-b