UITextField

一、简介

<<UITextField(文本框) : UITextField被用作项目中获取用户信息的重要控件.在App中UITextField是出现频率最高的控件之一.

<<继承关系:UITextField-->UIControl-->UIView-->UIResponder-->NSObject


格式为

1-->初始化作用

typedef NS_ENUM(NSInteger, UITextBorderStyle) {

UITextBorderStyleNone,

UITextBorderStyleLine,

UITextBorderStyleBezel,

UITextBorderStyleRoundedRect

};(如果属性有枚举类型的话,这里会有枚举类型说明

UITextField*textField = [[UITextFieldalloc]initWithFrame:CGRectMake(10,10,300,30)];  (这是具体的例子

@property(nullable, nonatomic,copy) NSString *placeholder; // UITextField 设置提示文字    (这是说明

二、UITextField的文本属性(属性的顺序与苹果API一致)

1-->设置文字

textField.text = @"我是文本框";//设置文字

@property(nullable, nonatomic,copy) NSString *text;//设置显示文字, 默认是空的

2-->设置富文本

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:label.text];-->先把UITextField上的文字赋值给可变字符串

[str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(5,10)];-->设置更改后的颜色和改变文字的区域

[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Courier-BoldOblique" size:30.0] range:NSMakeRange(20, 25)];-->设置更改后的字体大小和改变文字的区域

textField.attributedText = str;-->把改后的字符串重新赋值给UITextField

@property(nullable, nonatomic,copy) NSAttributedString *attributedText; //更改任意文字的颜色和字体大小

3-->设置文字颜色

textField.textColor = [UIColor redColor];//设置文字颜色

@property(nullable, nonatomic,strong) UIColor *textColor;// 默认是不透明的黑色

4-->设置字号//一般方法

textField.font = [UIFont systemFontOfSize:30];

@property(null_resettable, nonatomic,strong) UIFont *font;//  设置字体(系统字体默认12号字体)

5-->文字字体加粗//系统加粗方法

[textField setFont:[UIFont boldSystemFontOfSize:25]];

6-->自定义文字字体和字号

textField.font = [UIFont fontWithName:@"Zapfino"size:30];

7-->自定义文字字体加粗和字号

[textFieldl setFont:[UIFont fontWithName:@"Helvetica-Bold"size:25]];

8-->文字对齐方式

typedef NS_ENUM(NSInteger, NSTextAlignment) {

NSTextAlignmentLeft      = 0,    // 居左对齐

#if TARGET_OS_IPHONE

NSTextAlignmentCenter    = 1,    //居中对齐

NSTextAlignmentRight    = 2,    // 居右对齐

#else /* !TARGET_OS_IPHONE */

NSTextAlignmentRight    = 1,    //居右对齐

NSTextAlignmentCenter    = 2,    //居中对齐

#endif

NSTextAlignmentJustified = 3,    //合理铺满 等同于居左

NSTextAlignmentNatural  = 4,    //默认 等同于居左

}

textField.textAlignment = NSTextAlignmentCenter;

@property(nonatomic)        NSTextAlignment    textAlignment;//  对齐方式,默认是NSTextAlignmentNatural (iOS 9之前, 默认是 NSTextAlignmentLeft)

默认都是竖直居中的

UITextField不能设置竖直方向的排列布局,但是可以通过sizeToFit改变UITextField的frame来实现曲线救国。

9-->设置边框样式,只有设置了才会显示边框样式

typedef NS_ENUM(NSInteger, UITextBorderStyle) {

UITextBorderStyleNone,//无边框

UITextBorderStyleLine,//线性矩形

UITextBorderStyleBezel,//尖角矩形

UITextBorderStyleRoundedRect//圆角矩形

};

textField.borderStyle= UITextBorderStyleNone;

@property(nonatomic) UITextBorderStyle borderStyle; //默认是UITextBorderStyleNone。如果设置为UITextBorderStyleRoundedRect、自定义背景图片将被忽略。

10-->设置默认字体属性

[textField setDefaultTextAttributes: @{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Light" size:20.0], NSForegroundColorAttributeName: [UIColor redColor]} ];//设置默认字体与文本颜色

@property(nonatomic,copy) NSDictionary*defaultTextAttributes;//将属性应用于文本的全部范围。未设置的属性表现为默认值。

11-->设置缺省时显示的灰度字符串

textField.placeholder = @"password";//当输入框没有内容时,水印提示提示内容为password

@property(nullable, nonatomic,copy) NSString *placeholder; //默认是70%的灰色

12-->通过AttributedString设置缺省字符串

NSMutableAttributedString *verifyStr = [[NSMutableAttributedString alloc]initWithString:@"请输入验证码" attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14],NSForegroundColorAttributeName: [UIColor colorWithRed:181/255.0 green:181/255.0 blue:181/255.0 alpha:1.0]}];

[_VerifyTF setAttributedPlaceholder:verifyStr];//设置缺省字符串文本、字号和颜色等属性

@property(nullable, nonatomic,copy) NSAttributedString *attributedPlaceholder; 

13-->设置再次编辑就清空

text.clearsOnBeginEditing = YES;//开启再次编辑就清空

@property(nonatomic) BOOL clearsOnBeginEditing; //设置UITextField是否拥有一键清除的功能,默认为NO

14-->设置UITextField自适应文本框大小

textField.adjustsFontSizeToFitWidth = YES;//设置文字自适应宽度

@property(nonatomic) BOOL adjustsFontSizeToFitWidth;

//设置调整文字大小以适配宽度(即输入不下时缩小文字,实在缩小不了了,就向下滚动),默认是向右滚动的

15-->设置自动缩小显示的最小字体大小

textField.minimumFontSize = 20;//设置最小字体大小

@property(nonatomic) CGFloat minimumFontSize; //.默认是0.0。设置最小字号,在adjustsFontSizeToFitWidth = YES,才有效,即小于这个字号的时候,我就不缩小了,直接向右滚动

15-->设置UITextFieldDelegate代理

textField.delegate = self;//设置UITextField Delegate代理

@property(nullable, nonatomic,weak) id <UITextFieldDelegate>delegate; //弱引用

三、设置UITextField的背景属性

1-->设置背景图片

textField.background= [UIImageimageNamed:@"1.png"];

@property(nullable, nonatomic,strong) UIImage *background; //绘制边框,图像应可伸缩

2-->设置禁用时的背景图片

textField.disabledBackground = [UIImage imageNamed:@"cc.png"];//设置enable为no时,textfield的背景

@property(nullable, nonatomic,strong) UIImage *disabledBackground;(默认 nil,忽略背景不设置。图片可能会被拉伸.)当UITextField被禁用时,显示文本的背景图片。

四、UITextField的编辑属性

1-->读取是否正在编辑(只读属性)

  BOOL editing=text.editing ;

@property(nonatomic,readonly,getter=isEditing) BOOL editing;

2-->是否允许更改字符属性字典

textField.allowsEditingTextAttributes=YES;

@property(nonatomic) BOOL allowsEditingTextAttributes; //

默认是NO。允许用样式操作编辑文本属性并粘贴富文本

3-->设置属性字典

NSMutableDictionary * attributesDic = [textView.typingAttributes mutableCopy];

[attributesDic setObject:[UIColor redColor] forKey:NSForegroundColorAttributeName];

// automatically resets when the selection changes

// 重新设置 接下来改变的文字 的属性字典

textField.typingAttributes = attributesDic;

@property(nullable, nonatomic,copy) NSDictionary*typingAttributes NS_AVAILABLE_IOS(6_0); //.(当选中文本时,自动复位)适用于用户输入的新文本的属性。字典包含适用于新类型文本的属性键(和对应的值)。当文本字段的选择更改时,自动清除字典的内容。如果文本字段不是编辑模式,此属性包含值为零。类似地,除非文本字段当前处于编辑模式,否则不能将此属性赋值给该属性

4-->设置是否显示清除按钮

typedef NS_ENUM(NSInteger, UITextFieldViewMode) {

UITextFieldViewModeNever,//从不显示

UITextFieldViewModeWhileEditing,//编辑时显示

UITextFieldViewModeUnlessEditing,//非编辑时显示

UITextFieldViewModeAlways//一直显示

};

myTextField.clearButtonMode = UITextFieldViewModeAlways;//一直显示清除按钮

@property(nonatomic) UITextFieldViewMode clearButtonMode; //当清除按钮出现时设置。默认是UITextFieldViewModeNever

五、UITextField的View属性

1-->设置输入框左边的view

UIView *view1=[[UIView alloc]init];

//x和y无效,x都是0,而y是根据高度来自动调整的。即高度如果超过textField则默认是textField高,如小于textField高度,则上下居中显示。唯一有效的就是宽度

view1.frame=CGRectMake(10, 500, 50, 10);

view1.backgroundColor=[UIColor orangeColor];

textFiled1.leftView=view1;

@property(nullable, nonatomic,strong) UIView *leftView; // 左侧 view 视图,例如搜索栏当中的放大镜。要配合 leftViewMode 使用。

2-->设置输入框左视图的显示模式

typedef NS_ENUM(NSInteger, UITextFieldViewMode) {

UITextFieldViewModeNever,//从不显示

UITextFieldViewModeWhileEditing,//编辑时显示

UITextFieldViewModeUnlessEditing,//非编辑时显示

UITextFieldViewModeAlways//一直显示

};

textFiled.leftViewMode=UITextFieldViewModeAlways;

@property(nonatomic) UITextFieldViewMode leftViewMode; //当左边视图出现时设置。默认是UITextFieldViewModeNever

3-->设置输入框右边的view

UIView *view1=[[UIView alloc]init];

//x和y无效,x都是0,而y是根据高度来自动调整的。即高度如果超过textField则默认是textField高,如小于textField高度,则上下居中显示。唯一有效的就是宽度

view1.frame=CGRectMake(10, 500, 50, 10);

view1.backgroundColor=[UIColor orangeColor];

textFiled1.rightView=view1;

@property(nullable, nonatomic,strong) UIView *rightView; // 右侧 view 视图,例如书签按钮。要配合 rightViewMode 使用。

4-->设置输入框右视图的显示模式

typedef NS_ENUM(NSInteger, UITextFieldViewMode) {

UITextFieldViewModeNever,//从不显示

UITextFieldViewModeWhileEditing,//编辑时显示

UITextFieldViewModeUnlessEditing,//非编辑时显示

UITextFieldViewModeAlways//一直显示

};

textFiled.rightViewMode=UITextFieldViewModeAlways;

@property(nonatomic) UITextFieldViewMode rightViewMode; //当右边视图出现时设置。默认是UITextFieldViewModeNever

六、UITextField的界面重写绘制

1-->重写重置边缘区域

-(CGRect)borderRectForBounds:(CGRect)bounds{

return CGRectInset(bounds,10,0);

}

- (CGRect)borderRectForBounds:(CGRect)bounds;

2-->重写重置文字区域

-(CGRect)textRectForBounds:(CGRect)bounds{

returnCGRectInset(bounds,10,0);

}

- (CGRect)textRectForBounds:(CGRect)bounds;

3-->重写重置占位符区域

-(CGRect)placeholderRectForBounds:(CGRect)bounds{

returnCGRectInset(bounds,10,0);

}

- (CGRect)placeholderRectForBounds:(CGRect)bounds;

4-->重写重置编辑区域

-(CGRect)editingRectForBounds:(CGRect)bounds{

returnCGRectInset(bounds,10,0);

}

- (CGRect)editingRectForBounds:(CGRect)bounds;

5-->重写来重置clearButton位置,改变size可能导致button的图片失真

-(CGRect)clearButtonRectForBounds:(CGRect)bounds{

returnCGRectInset(bounds,10,0);

}

- (CGRect)clearButtonRectForBounds:(CGRect)bounds;

6-->重写输入框左视图区域

-(CGRect)leftViewRectForBounds:(CGRect)bounds{

returnCGRectInset(bounds,10,0);

}

- (CGRect)leftViewRectForBounds:(CGRect)bounds;

7-->重写输入框右视图区域

-(CGRect)rightViewRectForBounds:(CGRect)bounds{

returnCGRectInset(bounds,10,0);

}

- (CGRect)rightViewRectForBounds:(CGRect)bounds;

8-->重载drawTextInRect方法

-(void) drawTextInRect:(CGRect)rect {

return[super drawTextInRect:UIEdgeInsetsInsetRect(rect,self.neiinsets)];

}

-(void) drawTextInRect:(CGRect)rect;

9-->重载drawPlaceholderInRect方法

-(void) drawPlaceholderInRect:(CGRect)rect {

return[super drawPlaceholderInRect:UIEdgeInsetsInsetRect(rect,self.neiinsets)];

}

-(void) drawPlaceholderInRect:(CGRect)rect;

七、UITextField的键盘属性

1-->当文本字段成为第一响应者时,自定义输入视图显示。

UIImageView *imgView1=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"logo-60@3x.png"]];

imgView1.frame=CGRectMake(60, 60, 300, 300);

textFiled.inputView=imgView1;

@property (nullable, readwrite, strong) UIView *inputView;//只有height值会对视图有影响,只会改变附加视图的高度,弹出添加的这个视图,一般用作像银行app的自定义键盘

2-->当文本字段成为第一响应者时,该自定义辅助视图显示。

UIView * view = [[UIView alloc] initWithFrame:CGRectMake(100, 50, 100, 50)];

view.backgroundColor = [UIColor redColor];

// 在键盘上附加一个视图,一般用于添加一个收回键盘的按钮

textFiled.inputAccessoryView = view;

@property (nullable, readwrite, strong) UIView *inputAccessoryView;// 在键盘上附加一个视图,一般用于添加一个收回键盘的按钮

3-->注销第一响应(収键盘)

[self.view endEditing:YES];

- (BOOL)endEditing:(BOOL)force;//注销当前view(或它下属嵌入的text fields)的first responder 状态。

八、UITextField的UITextFieldDelegate代理方法

可选方法

1-->点击输入框时触发的方法,返回YES则可以进入编辑状态,NO则不能。

#pragma mark - UITextField代理方法

/** 将要开始编辑

@param textField UITextField对象

@return YES:允许编辑; NO:禁止编辑 

*/

- (BOOL)textFieldShouldBeginEditing:(UITextField*)textField{

//返回一个BOOL值,指定是否循序文本字段开始编辑

return YES;

}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField; //.当文本将要开始编辑时调用这个代理方法,返回 NO 时驳回编辑状态。

2-->开始编辑时调用的方法

/** 

开始编辑,即成为第一响应者,此时光标出现

@param textField UITextField对象 

*/

- (void)textFieldDidBeginEditing:(UITextField*)textField{

//开始编辑时触发,文本字段将成为first responder

}

- (void)textFieldDidBeginEditing:(UITextField *)textField; //当文本正在开始编辑时调用,变为第一响应者

3-->将要结束编辑时调用的方法,返回YES则可以结束编辑状态,NO则不能

/**

将要结束编辑

应用场景:如果当前TextField有内容,则返回YES,允许收键盘或更换TextField;

当前TextField没有输入内容,返回NO,此时不能收起键盘或者更换TextField

@param textField UITextField对象

@returnYES:允许释放键盘(注销第一响应者); NO:不允许释放键盘(始终是第一响应者)

*/

- (BOOL)textFieldShouldEndEditing:(UITextField*)textField{

//返回BOOL值,指定是否允许文本字段结束编辑,当编辑结束,文本字段会让出first responder

//要想在用户结束编辑时阻止文本字段消失,可以返回NO

//这对一些文本字段必须始终保持活跃状态的程序很有用,比如即时消息

return NO;

}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField; //当文本将要结束编辑时进行调用,返回 YES 时允许编辑停止或者注销第一响应者,返回 NO,不允许编辑会话结束。

4-->结束编辑调用的方法

/**

已经结束编辑

(即使shouldEndEditing方法返回NO或者调用了endEditing:YES,该方法仍可能调用)

官方注释:may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called

@param textField UITextField对象

*/

- (void)textFieldDidEndEditing:(UITextField*)textField{

//结束编辑时触发

}

- (void)textFieldDidEndEditing:(UITextField *)textField; 

//上面返回YES后执行;上面返回NO时有可能强制执行(e.g.view removed from window)

5-->结束编辑调用的方法(iOS 10.0开始引入)

/**

已经结束编辑(iOS 10.0开始引入)

如果实现,将取代textFieldDidEndEditing:方法

@param textField UITextField对象

@param reason 结束原因(正常代理结束或者被迫取消)

*/

- (void)textFieldDidEndEditing:(UITextField *)textField reason:(UITextFieldDidEndEditingReason)reason {

//结束编辑时触发(iOS 10.0开始引入)

}

- (void)textFieldDidEndEditing:(UITextField *)textField reason:(UITextFieldDidEndEditingReason)reason NS_AVAILABLE_IOS(10_0) ;//如果实现,将取代textFieldDidEndEditing:方法

6-->将要改变文字内容时调用的方法

/**

将要改变文字内容时

应用场景:

1.撤销上一次输入

2.跟踪本TextField所做的最后一次修改

3.防止文字被改变

4.限制输入字符类型

@param textField UITextField对象

@param range 被修改内容的范围

@param string 修改内容取代者

@return  YES:允许修改; NO:不允许修改

*/

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

returnYES;

}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; //询问代理文本是否可以被替换,如果返回 NO,不被替换,YES 可被替换。

7-->当按下清除按钮时调用的方法

/**

当按下清除按钮时

@param textField UITextField对象

@return YES:允许清除; NO:不许清除

 */

- (BOOL)textFieldShouldClear:(UITextField *)textField {

return YES;

}

- (void)textFieldShouldClear:(UITextField *)textField;

8-->按下键盘返回键调用的方法

/**

按下键盘返回键时

应用举例:调用resignFirstResponder方法收回键盘

@param textField UITextField对象

@return 我发现返回YES或NO,效果都一样...

*/

- (BOOL)textFieldShouldReturn:(UITextField *)textField {

return [textField resignFirstResponder];

}

- (void)textFieldShouldReturn:(UITextField *)textField;

九、UITextField的通知

UITextField派生自UIControl,所以UIControl类中的通知系统在文本字段中也可以使用。除了UIControl类的标准事件,你还可以使用下列UITextField类特有的事件

UITextFieldTextDidBeginEditingNotification

UITextFieldTextDidChangeNotification

UITextFieldTextDidEndEditingNotification

当文本字段退出编辑模式时触发。通知的object属性存储了最终文本。

因为文本字段要使用键盘输入文字,所以下面这些事件发生时,也会发送动作通知

UIKeyboardWillShowNotification  //键盘显示之前发送

UIKeyboardDidShowNotification   //键盘显示之后发送

UIKeyboardWillHideNotification  //键盘隐藏之前发送

UIKeyboardDidHideNotification   //键盘隐藏之后发送

十、UITextField的UITextFieldDelegate代理方法拓展

1-->限制输入字符类型

在代理方法中作判断,符合返回YES,不符合返回NO。

例如匹配输入为纯数字:

/**

将要改变文字内容时

 应用场景:

1.撤销上一次输入

 2.跟踪本TextField所做的最后一次修改

 3.防止文字被改变

 4.限制输入字符类型

@param textField UITextField对象

@param range 被修改内容的范围

@param string 修改内容取代者

@returnYES:允许修改; NO:不允许修改 

*/

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

// 匹配纯数字NSString *regex = @"[0-9]";

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

return[pred evaluateWithObject:string];// 匹配返回YES,否则返回NO

}

2-->限制输入字符个数

字符个数决定了字符串的长度。

在代理方法中很难实时地获得字符串长度,因此不好在代理方法里判断。好在苹果提供了监听UITextField的编辑发生改变的事件,可在该事件中作判断。

首先要添加事件:

[textField addTarget:selfaction:@selector(textFieldDidChange:)forControlEvents:UIControlEventEditingChanged];

// 当编辑发生改变

- (void)textFieldDidChange:(UITextField*)textField{

// 获取字符串长度

NSUInteger strLength =0;

for (NSUInteger I=0; I<textField.text.length; i++) {

unichar uc = [textField.textcharacterAtIndex: I];

strLength += isascii(uc) ?1:2;// 汉字两个字节

}

// 如果字符串大于5,裁掉后尾

if(strLength >5) {

textField.text= [textField.text substringToIndex:5];

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容