Skip to content

Latest commit

 

History

History
42 lines (31 loc) · 1.61 KB

README.md

File metadata and controls

42 lines (31 loc) · 1.61 KB

UIVIewController-LowCoupling

###Low coupling of UIVIewController

Create a category of UINavigationController.

UINavigationController+PushVCByName.m

#import <objc/runtime.h>

@implementation UINavigationController (PushVCByName)

- (void)pushViewControllerName:(NSString *)viewControllerName para:(NSDictionary *)para animated:(BOOL)animated
{
    const char *name = [viewControllerName UTF8String];
    Class vcClass = objc_getClass(name);
    if (vcClass != NULL) {
        UIViewController *vc = [[vcClass alloc]init];
        
        if (para != nil) {
            [para enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
                 NSString *propertyName = key;
                objc_property_t property = class_getProperty(vcClass, [propertyName UTF8String]);
                if (property != NULL) {
                  [vc setValue:obj forKey:propertyName];
                }else{
                    @throw [NSException exceptionWithName:@"UIViewController set Wrong property" reason:[NSString stringWithFormat:@"%@ don't have property %@", viewControllerName, propertyName] userInfo:nil];
                }
               
            }];
        }
        
        [self pushViewController:vc animated:YES];
    }
}


- (void)pushViewControllerName:(NSString *)viewControllerName animated:(BOOL)animated
{
    [self pushViewControllerName:viewControllerName para:nil animated:animated];
}

GetviewControllerName, useruntime to get theClass of the UIViewController, create an instance, detect the property, then use KVO to set the property of the new UIViewController.