标签视图

tabBar是UITabBar对象, 包含多个UITabBarItem,每一个tabBaritem对应一个viewController. tabBar高度49

三大视图 :UITabBarController、 UINavigationController、UITabViewController 通常组合出现;
UITabBarController可以嵌套UINavigationController

// block 在使用的过程中可能会产生循环引用。
// 1. 为什么 ? ( 面试题 :)
//  因为 block 在当时定义的时候 , 相当于使用的是 setter 方法。 , 而且语义设置用的是 copy 如果在内部使用 self 的相关属性、实例变量都会对他们的引用加 1.!!!!!!
// 2.怎么解决?
//  为了防止产生循环引用 , 会对使用之前定义一个新的指针变量指向 self, 而且是弱引用即 __block ( arc 下用 "__weak")!!

    // Block: 匿名函数
   
// 根据有无返回值、有无参数可以分为四种 :
   
// : 有返回值 , 有参数
   
// : 有返回值 , 无参数
   
// : 无返回值 , 有参数
   
// : 无返回值 , 无参数
   
// block 使用分为两部分 : 定义 ( 实现 ), 调用 ( 回调 );
//  第一种 :
//  定义一个字符串类型 , 参数为 int 类型的 Block. 名字为 myBlock 。作用是将 int 类型的数据转化为字符串类型。
//  第一种 : 有返回值 , 有参数
   
// 1. 定义
   
NSString *(^myBlock)( int a) = ^ NSString *( int a) {
       
return [ NSString stringWithFormat : @"%d" , a];
    };
   
// 2. 调用
   
NSString *str = myBlock( 6 ); // block 的调用
   
// 上面的 block 中返回值类型是什么 -- NSString; block 名字是什么 -- myBlock; block 类型是什么 ?-- NSString *(^)(int)
//  第二种 : 有返回值 , 无参数
   
int (^myBlock1)() = ^{
       
return 1 ;
    };
//  第三种 : 无返回值 , 有参数
   
void (^myBlock2)( int a) = ^( int a) {
       
NSLog ( @"%d" , a);
    };
//  第四种 : 无返回值 , 无参数
   
void (^myBlock3)() = ^{
       
NSLog ( @"" );
    };

Block的传值步骤:
#warning 1. 重定义一个 block (P 首字母大写因为是一个类 )
typedef void (^PassValueBlock)( NSString *value);

#warning 2. 设置属性 ( 在将 block 定义成属性的时候需要将其进行 copy 因为定义的 block 本身是在全局区或者栈区 , 为了能够管理 block 需要把它拷贝堆区 , 由程序员管理。 )
@property ( nonatomic , copy ) PassValueBlock passValue;

#warning 3. Block 属性赋值
         __block FirstViewController *Test = self ;
    bVC. passvalue = ^ void ( NSString *value) {
        Test. label . text = value;
    };

#warning 4. 传值
//  不添加返回键 , 系统自带返回方法 !!!
//  willDidDisappear( 第二种情况 )
- ( void )viewWillDisappear:( BOOL )animated {
   
// 1. 先引用系统中父类的方法
    [
super viewWillDisappear :animated];
   
// 2. block 的值进行判断
   
if ( self . passValue != nil ) {
       
UITextField *textField = ( UITextField *) self . view . subviews [ 0 ];
       
self . passValue (textField. text );
    }
}

属性传值的步骤: (从前往后传)
#warning 1. 定义属性。 (PS: 外界传什么类型的数据,就定义成什么类型的数据。 )
@property ( nonatomic , retain ) NSString *text;

#warning 2. 给相关属性赋值。
    secondVC. text = textField. text ;

#warning 3. 使用外界传过来的值。
    label. text = _text ;



代理传值的步骤:(从后往前传值)
#warning 2-1. 定义协议。 ( 协议中的方法参数类型是想从第二个界面往外传什么类型,就是什么类型的。 )
@protocol SecondVCDelegate < NSObject >

- (
void )passValue:( NSString *)value;

@end

#warning  2-2 定义 delegate 属性,给外界提供接口。
@property ( nonatomic , assign ) id < SecondVCDelegate >delegate;

#warning 2-3. delegate 属性赋值。
    secondVC. delegate = self ;

#warning 面试题 : 协议指的的是一堆方法的声明
#warning 2-4.
接收协议
@interface RootViewController () < SecondVCDelegate >

#warning 2-5. 实现协议中的方法
#pragma mark -
协议
- ( void )passValue:( NSString *)value {
   
// 给第一个界面的 textField text 赋值。
   
UITextField *textField = [ self . view . subviews objectAtIndex : 0 ];
    textField.
text = value;
}

#warning 2-6. 在某一个时间点让 delegate 去执行协议中的方法
    if ( _delegate && [ _delegate respondsToSelector : @selector (passValue:)]) {
       
UITextField *textField = [ self . view . subviews objectAtIndex : 1 ];
        [
_delegate passValue :textField. text ];
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对吉林省农村信用社联合社数据中心对标签视图的建设,以下是一些建议: 1. 梳理业务场景和需求:在建设标签视图之前,需要对不同的业务场景和需求进行深入的了解和梳理,明确需要哪些标签,以及这些标签的分类和组织方式。 2. 制定标签管理规范:标签视图的建设需要遵循一定的管理规范和标准,例如标签名称、描述、类别、属性等的定义和规范,标签的创建、删除、修改等的流程和权限等。 3. 设计标签分类和组织结构:标签视图应该根据业务场景和需求进行分类和组织,例如按照客户、产品、渠道、市场、风险等进行分类,再根据不同的标签类型和属性进行细分和组织。 4. 建立标签管理平台:建立一个标签管理平台,用于管理标签库和标签视图,包括标签的创建、修改、删除、分类、组织等功能。 5. 定期维护和更新:标签视图是一个动态的过程,需要不断地维护和更新,例如添加新的标签、删除无用的标签、更新标签的属性和分类等。 6. 提供培训和支持:对于标签视图的建设和使用,需要提供相应的培训和支持,帮助用户了解标签的定义和使用方式,提高标签的使用效率和准确性。 综上所述,建设标签视图需要全面考虑业务需求和场景,遵循一定的管理规范和标准,设计合理的分类和组织结构,建立标签管理平台,定期维护和更新,并提供相应的培训和支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值