n-b / UIView-NibLoading

UIView category and subclass for loading content subviews from nib files.
http://bou.io/UIView-NibLoading.html
MIT License
67 stars 14 forks source link

Constraint IBOutlets #6

Open Codewaves opened 10 years ago

Codewaves commented 10 years ago

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);
        }
n-b commented 10 years ago

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

meknil commented 9 years ago

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??

n-b commented 9 years ago

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

meknil commented 9 years ago

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.

n-b commented 9 years ago

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 commented 9 years ago

@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.