zoukankan      html  css  js  c++  java
  • 减少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];
    }
    
  • 相关阅读:
    Android 获取View在屏幕中的位置【转】
    算法学习资源 -- 2018年8月21日星期二
    Activity SingleInstance启动模式
    Android Studio添加aar依赖的两种方式
    Multiple dex files define Lcom/google/gson/internal/Streams$AppendableWriter$CurrentWrite;
    Android Studio添加aar依赖
    jdk-8u181-docs.chm -- 制作时间2018年8月12日
    大串中查找校串出现的次数(11)
    字符串反转(10)
    String类的替换方法(9)
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6984199.html
Copyright © 2011-2022 走看看