引言:方今在工作中遇到与1些API对接的post的数量供给将对象的字段首字母小写。
解决办法有二种:
首先种:使用对象的字段属性设置JsonProperty来达成(不引入,因为须求手动的改造每一个字段的特性)

前言

当今你准备用3个种类的类依然是您写的类,可是那几个类并不可能满意你的急需,你须求极度增添一个性格。壹般消除办法要么是extends,要么采纳category。而自笔者并不引入应用extends,首借使耦合性太强,1般自身利用category。我们都知道,分类中是无力回天设置属性的,假若在分拣的扬言中写@property
只好为其生成get 和 set
方法的宣示,但是有时使用项目也亟需充实3个额外属性,那么如何做吧?那年,runtime的涉及属性就能表明它的功效了。壹般都是key
value 的存在。

日前项目用到了bootstrap框架,当中前者用的校验,选用的是bootstrapvalidator插件,也是不行庞大的一款插件。作者那边用的是0.五.二本子。

属性是类提需要外部调用时用,的可以利用对象.属性设置或读取三个值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来设置格式化的方法(推荐使用)

用法

一般自身用在category里,合理利用它能让category发布越来越大的功效。

  • UIViewRuntime性格之提到对象,实体对象类别化成Json。的category

.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连发那么些,能够参见笔者付出品种计算的一套库WTSDK或者有点地点描述得不是很好,大概描述不当了,希望你们能给自家留言,thank!

1. 拿走validator对象或实例

经过品质访问字段 讲概念大概糟糕讲,下边来看二个例子吗!

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

 1般选取校验是直接调用$(form).bootstrapValidator(options)来开端化validator。起首化后有三种办法取得validator对象或实例,可以用来调用其指标的章程,比如调用resetForm来重新设置表单。有三种方法赢得:

classProgram{ privateint田野一;//这几个田野(field)一正是字段publicintField1//那几个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方法)

若果满足上边多少个原则,那么大家便足以大胆地动用公共字段:

1. 允许专擅读写;

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

三. 值的改变不须要吸引类中别的任何成员的对应改动;

属性的采取规范则刚刚跟变量相反,只要满意上面任何1个规格,就应有利用品质:

一. 须要字段只能读或然只可以写;

2. 亟需限制字段的取值范围;

3. 在更动多少个字段的值的时候希望更改目的的其余一些景色;

总括:就算在实际项目标支出进程中,公共字段和性质在伏贴的口径下都能够选择,然则大家理应尽量的使用性质,而不是多少成员;把持有的字段都安装为私有字段,借使要暴露它们,则把它们封装成属性,那也是微软推荐的主意。

金沙注册送58 ,那种方法获得的是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)

启用或剥夺钦命字段的装有校验。这里作者的实

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

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

 // 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');
    }
  });

五.
getFieldElements(田野同志)依据钦点的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方法可用在急需点击开关也许链接而非提交对表单进行校验的时候。
由第3条可见,调用情势同样有两种: 

$(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地图