降低UIViewController切换的耦合

来源:互联网 发布:python ascii转字符 编辑:程序博客网 时间:2024/05/16 11:54

降低UIViewController切换的耦合


我们一般切换UIViewController的时候用的是如下代码

#import "UIViewControllerDemo.h"UIViewControllerDemo *vc = [UIViewControllerDemo alloc] initWithNibName:nil bundle:nil] autorelease];[self.navigationController pushViewController:vc animated:YES];

当我们需要切换的UIViewController多的时候呢,代码难免写成:

#import "UIViewControllerDemo1.h" #import "UIViewControllerDemo2.h" #import "UIViewControllerDemo3.h" #import "UIViewControllerDemo4.h" UIViewControllerDemo1 *vc1 UIViewControllerDemo2 *vc2 UIViewControllerDemo3 *vc3 UIViewControllerDemo4 *vc4

以后维护的时候很是麻烦
下面我们将对UIViewController切换的方法进行改造

-(void) pushVC:(NSString *)vcName{    Class class = NSClassFromString(vcName);    NSAssert(class != nil, @"Class 必须存在");    UIViewController *vc = [[[NSClassFromString(vcName) alloc] init] autorelease];    [self.navigationController pushViewController:vc animated:YES];}

这里可以加入一个协议,使用我们指定的方法来初始化,这样可以在初始话的同时带入参数

@protocol XYSwitchControllerProtocol <NSObject>-(id) initWithObject:(id)object;@end-(void) pushVC:(NSString *)vcName object:(id)object{    Class class = NSClassFromString(vcName);    NSAssert(class != nil, @"Class 必须存在");    UIViewController *vc = nil;    if ([class conformsToProtocol:@protocol(XYSwitchControllerProtocol)]) {        vc = [[[NSClassFromString(vcName) alloc] initWithObject:object] autorelease];    }else {        vc = [[[NSClassFromString(vcName) alloc] init] autorelease];        vc.parameters = object;    }    [self.navigationController pushViewController:vc animated:YES];}

模态的方法则多个考虑个UINavigationController

-(void) modalVC:(NSString *)vcName withNavigationVC:(NSString *)nvcName object:(id)object succeed:(UIViewController_block_void)block{    Class class = NSClassFromString(vcName);    NSAssert(class != nil, @"Class 必须存在");    UIViewController *vc = nil;    if ([class conformsToProtocol:@protocol(XYSwitchControllerProtocol)]) {        vc = [[[NSClassFromString(vcName) alloc] initWithObject:object] autorelease];    }else {        vc = [[[NSClassFromString(vcName) alloc] init] autorelease];        vc.parameters = object;    }    UINavigationController *nvc = nil;    if (nvcName) {        nvc = [[[NSClassFromString(vcName) alloc] initWithRootViewController:vc] autorelease];        [self presentViewController:nvc animated:YES completion:block];        return;    }    [self presentViewController:vc animated:YES completion:block];}

0 0
原创粉丝点击