并让字段的首字母小写,Runtime性情之提到对象

引言:近年来在职业中遭逢与一些API对接的post的数据要求将目的的字段首字母小写。
化解办法有三种:
首先种:使用对象的字段属性设置JsonProperty来落到实处(不推荐,因为必要手动的改变每种字段的品质)

前言

美高梅开户网址 ,现行反革命您准备用二个种类的类依旧是你写的类,然则这几个类并无法满意你的供给,你须求相当增加6脾品质。一般消除办法要么是extends,要么使用category。而作者并不引入应用extends,首倘诺耦合性太强,壹般自身使用category。大家都知道,分类中是无力回天设置属性的,倘诺在分拣的宣示中写@property
只好为其生成get 和 set
方法的注脚,可是有时使用项目也急需增添三个额外属性,那么如何做吧?今年,runtime的关系属性就能公布它的成效了。一般都是key
value 的留存。

近来项目用到了bootstrap框架,其中前者用的校验,选拔的是bootstrapvalidator插件,也是老大庞大的一款插件。笔者那边用的是0.5.二本子。

属性是类提要求外部调用时用,的能够利用对象.属性设置或读取1个值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发挥越来越大的效应。

  • 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. */};

并让字段的首字母小写,Runtime性情之提到对象。用法跟@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)一;//那一个田野(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方法)

若是满意下边多少个尺码,那么大家便能够大胆地应用集体字段:

壹. 允许私行读写;

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

3. 值的退换不供给抓住类中别的任何成员的照应退换;

属性的选用口径则刚刚跟变量相反,只要满意上边任何一个标准,就应有利用质量:

一. 渴求字段只好读也许只好写;

贰. 需求限制字段的取值范围;

三. 在改换叁个字段的值的时候希望改动指标的其余一些气象;

总计:即便在实际项指标支出进程中,公共字段和属性在十分的口径下都能够行使,不过大家应有尽量的行使性质,而不是多少成员;把全数的字段都设置为私有字段,要是要暴光它们,则把它们封装成属性,那也是微软推荐的格局。

那种方法赚取的是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将不实践其它的校验。1般需求时能够献身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.
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方法可用在必要点击按键可能链接而非提交对表单举行校验的时候。
由第三条可见,调用方式一样有两种: 

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