威尼斯人线上娱乐

实业对象种类化成Json,Runtime天性之提到对象

17 4月 , 2019  

引言:方今在工作中蒙受与某个API对接的post的多少要求将对象的字段首字母小写。
消除办法有三种:
第贰种:使用对象的字段属性设置JsonProperty来贯彻(不引入,因为需求手动的修改各类字段的属性)

前言

现行你准备用3个系列的类依然是您写的类,不过这些类并不可能满意你的急需,你需求10分增加二特性能。一般消除办法要么是extends,要么使用category。而自身并不推荐使用extends,重若是耦合性太强,一般笔者使用category。大家都知情,分类中是心有余而力不足设置属性的,假设在分拣的宣示中写@property
只好为其生成get 和 set
方法的扬言,可是有时使用项目也急需追加1个额外属性,那么咋做吧?这年,runtime的涉及属性就能表明它的意义了。一般都是key
value 的留存。

近年项目用到了bootstrap框架,当中前者用的校验,选拔的是bootstrapvalidator插件,也是可怜强劲的一款插件。小编那里用的是0.5.二版本。

天性是类提供给外部调用时用,的可以应用对象.属性设置或读取3个值get{returexxx;}表示可读set{xxx=value;}表示可写 字段就是类内部用的,用来囤积数据 private字段;

public class UserInfo
{
    [JsonProperty("id")]
    public int Id{ set; get; }
    [JsonProperty("userName")]
    public string UserName{ set; get; }
}

关于的点子

objc_setAssociatedObject 设置关联对象使用objc_getAssociatedObject
得到涉及对象使用objc_removeAssociatedObjects 移除关联对象使用

上边记录一下使用中学习到的连锁API,不定时更新。

public属性;

第贰种:使用newtonsoft.json来安装格式化的诀窍(推荐应用)

用法

实业对象种类化成Json,Runtime天性之提到对象。貌似笔者用在category里,合理施用它能让category发挥更加大的作用。

  • UIViewcategory

.h文件

#import <UIKit/UIKit.h>@interface UIView typedef void (^GestureActionBlock)(UIGestureRecognizer *ges);/** 单点击手势 */- tapGesture:(GestureActionBlock)block;/** 长按手势 */- longPressGestrue:(GestureActionBlock)block;@end

.m文件

#import "UIView+WT.h"#import <objc/runtime.h>@implementation UIView static char kActionHandlerTapBlockKey;static char kActionHandlerTapGestureKey;static char kActionHandlerLongPressBlockKey;static char kActionHandlerLongPressGestureKey;//单点击手势- tapGesture:(GestureActionBlock)block { self.userInteractionEnabled = YES; UITapGestureRecognizer *gesture = objc_getAssociatedObject(self, &kActionHandlerTapGestureKey); if  { gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleActionForTapGesture:)]; [self addGestureRecognizer:gesture]; objc_setAssociatedObject(self, &kActionHandlerTapGestureKey, gesture, OBJC_ASSOCIATION_RETAIN); } objc_setAssociatedObject(self, &kActionHandlerTapBlockKey, block, OBJC_ASSOCIATION_COPY);}- handleActionForTapGesture:(UITapGestureRecognizer *)gesture { if (gesture.state == UIGestureRecognizerStateRecognized) { GestureActionBlock block = objc_getAssociatedObject(self, &kActionHandlerTapBlockKey); if  { block; } }}//长按手势- longPressGestrue:(GestureActionBlock)block { self.userInteractionEnabled = YES; UILongPressGestureRecognizer *gesture = objc_getAssociatedObject(self, &kActionHandlerLongPressGestureKey); if  { gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleActionForLongPressGesture:)]; [self addGestureRecognizer:gesture]; objc_setAssociatedObject(self, &kActionHandlerLongPressGestureKey, gesture, OBJC_ASSOCIATION_RETAIN); } objc_setAssociatedObject(self, &kActionHandlerLongPressBlockKey, block, OBJC_ASSOCIATION_COPY);}- handleActionForLongPressGesture:(UITapGestureRecognizer *)gesture { if (gesture.state == UIGestureRecognizerStateBegan) { GestureActionBlock block = objc_getAssociatedObject(self, &kActionHandlerLongPressBlockKey); if  { block; } }}@end

本身表明下里面包车型地铁局地重点字段,比如OBJC_ASSOCIATION_RETAIN以此字段实际上是个枚举来的

typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) { OBJC_ASSOCIATION_ASSIGN = 0, /**< Specifies a weak reference to the associated object. */ OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object. * The association is not made atomically. */ OBJC_ASSOCIATION_COPY_NONATOMIC = 3, /**< Specifies that the associated object is copied. * The association is not made atomically. */ OBJC_ASSOCIATION_RETAIN = 01401, /**< Specifies a strong reference to the associated object. * The association is made atomically. */ OBJC_ASSOCIATION_COPY = 01403 /**< Specifies that the associated object is copied. * The association is made atomically. */};

用法跟@property中的strong 、weak、copy 、assign 、retain等证明属性的修饰符同样,笔者上面用到了block就对应OBJC_ASSOCIATION_COPY,而UITapGestureRecognizerUILongPressGestureRecognizer则对应OBJC_ASSOCIATION_RETAIN拓展修饰。当然实际上小编的UIViewcategory不停这几个,能够参见作者付出品种总括的1套库WTSDK大概有点地方描述得不是很好,大概描述不当了,希望您们能给自家留言,thank!

壹. 获取validator对象或实例

由此品质访问字段 讲概念恐怕不佳讲,上面来看二个事例吗!

 var user = new { Name = "john", Age = 19 }; 
 var serializerSettings = new JsonSerializerSettings
            {
                // 设置为驼峰命名
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            };
var userStr = JsonConvert.SerializeObject(user, Formatting.None, serializerSettings);

 一般接纳校验是平素调用$(form).bootstrapValidator(options)来初步化validator。早先化后有三种艺术赢得validator对象或实例,能够用来调用其目的的艺术,比如调用resetForm来重新设置表单。有三种方法取得:

classProgram{ privateint田野(field)1;//那几个田野同志1正是字段publicint菲尔德1//这几个Fileds一就是性质

威尼斯人线上娱乐,以上正是化解办法,看到这几个布局的材质相比少,做下记录

 1) 

{       get{returnfield1;}       set{field1=value;}

// Get plugin instance
var bootstrapValidator = $(form).data('bootstrapValidator');
// and then call method
bootstrapValidator.methodName(parameters)

     }        }//因为字段的造访修饰符为private外部不能够访问它,但可以定义属性为public来做客。希望对您有赞助啊。

鉴于质量的真面目是艺术(get或set方法)

只要满意下边多少个规格,那么大家便足以大胆地动用公共字段:

一. 允许专断读写;

二. 取值范围只受数据类型约束而无任何任何特定限制;

三. 值的改观不须求引发类中别的任何成员的应和改造;

天性的利用标准则正好跟变量相反,只要满意上边任何三个标准化,就应当使用性质:

一. 渴求字段只好读恐怕只好写;

二. 索要限制字段的取值范围;

叁. 在改换二个字段的值的时候希望改造目标的任何一些场地;

计算:即使在骨子里项目标开销过程中,公共字段和性子在适当的尺度下都能够运用,可是大家理应尽恐怕的运用质量,而不是多少成员;把具备的字段都安装为私有字段,借使要暴光它们,则把它们封装成属性,那也是微软引荐的格局。

那种格局获取的是BootstrapValidator的实例,能够直接调用其格局。

2) 

$(form).bootstrapValidator(methodName, parameters);

 那种格局获取的是意味着当前form的jquery对象,调用方式是将方法名和参数分别传入到bootstrapValidator方法中,能够链式调用。
 三种办法的运用各自如下:

// The first way
$(form)
  .data('bootstrapValidator')
  .updateStatus('birthday', 'NOT_VALIDATED')
  .validateField('birthday');

// The second one
$(form)
  .bootstrapValidator('updateStatus', 'birthday', 'NOT_VALIDATED')
  .bootstrapValidator('validateField', 'birthday');

2. defaultSubmit()

使用暗中同意的交给格局提交表单,调用此办法BootstrapValidator将不实践其它的校验。壹般须要时得以献身validator校验的submitHandler属性里调用。

使用:

$('#defaultForm').bootstrapValidator({
 fields: {
   username: {
 message: 'The username is not valid',
 validators: {
   notEmpty: {
  message: 'The username is required and can\'t be empty'
   }
 }
   }
 },
 submitHandler: function(validator, form, submitButton) {
   // a)
   // Use Ajax to submit form data
   //$.post(form.attr('action'), form.serialize(), function(result) {
 // ... process the result ...
   //}, 'json');

   //b)
   // Do your task
   // ...
   // Submit the form
   validator.defaultSubmit();
 }
});

3. disableSubmitButtons(boolean) 

启用或剥夺提交按键。BootstrapValidator里暗中认可的交由开关是兼具表单内的type属性值为submit的按键,即[type=”submit”]。
使用:

当登录战败时,重新启用提交按键。

$('#loginForm').bootstrapValidator({
    message: 'This value is not valid',
    feedbackIcons: {
      valid: 'glyphicon glyphicon-ok',
      invalid: 'glyphicon glyphicon-remove',
      validating: 'glyphicon glyphicon-refresh'
    },
    submitHandler: function(validator, form, submitButton) {
      $.post(form.attr('action'), form.serialize(), function(result) {
        // The result is a JSON formatted by your back-end
        // I assume the format is as following:
        // {
        //   valid: true,     // false if the account is not found
        //   username: 'Username', // null if the account is not found
        // }
        if (result.valid == true || result.valid == 'true') {
          // You can reload the current location
          window.location.reload();

          // Or use Javascript to update your page, such as showing the account name
          // $('#welcome').html('Hello ' + result.username);
        } else {
          // The account is not found
          // Show the errors
          $('#errors').html('The account is not found').removeClass('hide');

          // Enable the submit buttons
          $('#loginForm').bootstrapValidator('disableSubmitButtons', false);
        }
      }, 'json');
    },
    fields: {
      username: {
        validators: {
          notEmpty: {
            message: 'The username is required'
          }
        }
      },
      password: {
        validators: {
          notEmpty: {
            message: 'The password is required'
          }
        }
      }
    }
  });

 4. enableFieldValidators(field, enabled)

启用或剥夺钦命字段的有着校验。那里笔者的实

验结果是即使禁止使用了校验,好像对应的字段输入(文本框、下拉等)也会化为禁止使用。
使用:

当密码框不为空时,开启密码框和认同密码框的校验:

 // Enable the password/confirm password validators if the password is not empty
  $('#signupForm').find('[name="password"]').on('keyup', function() {
    var isEmpty = $(this).val() == '';
    $('#signupForm').bootstrapValidator('enableFieldValidators', 'password', !isEmpty)
            .bootstrapValidator('enableFieldValidators', 'confirm_password', !isEmpty);
    if ($(this).val().length == 1) {
      $('#signupForm').bootstrapValidator('validateField', 'password')
              .bootstrapValidator('validateField', 'confirm_password');
    }
  });

5.
get菲尔德Elements(田野同志)依照钦点的name获取钦赐的成分,重回值是null或二个jQuery对象数组。  

陆.
isValid()再次回到当前须要表明的具备字段是还是不是都合法。
调用此方法前需先调用validate来进行表达,validate方法可用在急需点击开关大概链接而非提交对表单实行校验的时候。使用:点击某按键时,提示全部字段是不是经过校验。 

$("#isAllValid").on("click", function(){
 alert($("#defaultForm").data('bootstrapValidator').isValid());
});

 7. resetForm(Boolean)

重新恢复设置表单中装置过校验的始末,将隐形全数错误提醒和Logo。
使用: 

$("#isAllValid").on("click", function(){
 alert($("#defaultForm").data('bootstrapValidator').isValid());
 if(!$("#defaultForm").data('bootstrapValidator').isValid()) {
 $("#defaultForm").data('bootstrapValidator').resetForm();
 }
});

 8. updateElementStatus($field, status, validatorName) 

履新成分状态。status的值有:NOT_VALIDATED, VALIDATING, INVALID or
VALID。 

9. updateStatus(field, status, validatorName)

履新内定的字段状态。BootstrapValidator暗中同意在校验某些字段合法后不再另行校验,当调用别的插件大概措施或者会转移字段值时,须求再行对该字段举行校验。
使用:

点击按键对文本框进行赋值,并对其再一次校验: 

$('#defaultForm').bootstrapValidator({
 fields: {
   username: {
 message: 'The username is not valid',
 validators: {
   notEmpty: {
  message: 'The username is required and can\'t be empty'
   }
 }
   },
   stringLength: {
 min: 6,
 max: 30,
 message: 'The username must be more than 6 and less than 30 characters long'
   }
 }
});

$("#setname").on("click", function(){
 $("input[name=username]").val('san');
 var bootstrapValidator = $("#defaultForm").data('bootstrapValidator');
 bootstrapValidator.updateStatus('username', 'NOT_VALIDATED').validateField('username'); 
 //错误提示信息变了
});

10. validate()

手动对表单举办校验,validate方法可用在急需点击开关只怕链接而非提交对表单进行校验的时候。
由第二条可见,调用格局一样有二种: 

$(form).bootstrapValidator(options).bootstrapValidator('validate');

// or
$(form).bootstrapValidator(options);
$(form).data('bootstrapValidator').validate();

11. validateField(field) 

对点名的字段进行校验。

上述正是本文的全部内容,希望对大家的读书抱有扶助,也冀望大家多多协助脚本之家。

你恐怕感兴趣的稿子:

  • JS组件Form表单验证神器BootstrapValidator
  • 依照jQuery
    完成bootstrapValidator下的全局验证
  • 实用又能够的BootstrapValidator表单验证插件
  • BootstrapValidator超详细教程(推荐)
  • Bootstrap中的表单验证插件bootstrapValidator使用办法整理(推荐)
  • jquery插件bootstrapValidator数据印证详解
  • Bootstrapvalidator校验、校验清除重新初始化的达成代码(推荐)
  • jquery插件bootstrapValidator表单验证详解
  • BootstrapValidator不触发校验的实今世码
  • bootstrapValidator
    bootstrap-select验证不可用的消除办法


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图