新浦京81707con > 功能介绍 > iOS开发小冷易忘知识点总结,iOS中UITableView性能优

原标题:iOS开发小冷易忘知识点总结,iOS中UITableView性能优

浏览次数:196 时间:2020-03-29

老是写一些东西,总会遇见五颜六色的错误.希望把他们收拾出来,附上解决的办法.由于错误实乃太多了,这里就以温馨境遇的一密密麻麻的坑.蒙受了就记下起来.希望帮到我们

收拾一下有个别偏冷知识点,有时看一下。各位道友倘诺开采什么错误请立刻指正,有好的东西也足将来下边补充!

在iOS应用中,UITableView应该是使用率最高的视图之一了。iPod、时钟、日历、备忘录、Mail、气候、照片、电话、短信、Safari、App Store、iTunes、Game Center⋯差不离具备自带的使用中都能看见它的身影,可以看见它的主要。

话十分少说,直接开头吧.楼主目前在写三个粗略的旅游app 用到了轮播图 在TableView中异步加载图片的难点.nib和storyboard的问题.frame在AutoLayoutx下错位.分页数据加载等的多数难题

  • 安装导航栏的背景颜色用barTintColor
    self.navigationBar.barTintColor = [UIColor colorWithRed:3/255.0f green:101/255.0f blue:100/255.0f alpha:1.0f] ;

  • 获取.plist文件:
    // 1.从地面文件中读取数据(在其实项目支出中在这里写互连网供给State of Qatar
    // 获取文件本地的门道
    NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"json"];
    // 把地点数据读抽出来,无需此外转变,正是二进制数据
    NSData *jsonData = [[NSData alloc] initWithContentsOfFile:filePath];

  • NSString字符串调换到NSData类型的数码:
    // NSString字符串转变到NSData类型的多少
    NSData *jsondata = [result dataUsingEncoding:NSUTF8StringEncoding] ;
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsondata options:NSJSONReadingMutableContainers error:nil] ;

  • 获得文本的惊人:
    // Label中文字的分寸私下认可是18

    • (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
      {
      WeiBoModel *weiboModel = _dataList[indexPath.row] ;
      NSString *textString = weiboModel.text ;
      CGSize size = [textString sizeWithFont:[UIFont systemFontOfSize:18] constrainedToSize:CGSizeMake(kScreenWidth, 1000)] ;
      return size.height 20;
      }
  • 安装图片拉伸:
    // 设置图片拉伸
    UIImage *bgImage = [UIImage imageNamed:@"userinfo_shadow_pic.png"];
    _bgImageView.image = [bgImage stretchableImageWithLeftCapWidth:15 topCapHeight:15];

只是在使用第三方使用时,却时时境遇质量上的标题,布满表以往滚动时相比卡,特别是table cell中含有图表的景况时。

ScrollView NavigationController ScrolleView呈现错位

图片 1scrollView图片展现错位

在我们采取ScrollView的时候,在AutoLayout下您节制好了ScrollView,可是你在ViewController 中钦赐了ContentSize的大小. 然后设置contentOffSet来展现你的视图

<strong>注意:就算您的视图恰恰处于NavigationController中的话,你会意识无论是您怎么设置contentOffSet 图片之处一贯不是处于叁个安然无恙的状态.你也许发掘你的contentOffSet 是没有错的,不然你会直接陷进去去调动你的contentOffSet的不得了点地方</strong>

演说:只要scrollView是其父视图上的率先个子视图,且navigationBar不隐敝的状态下,增添到scrollView里的视图,都会暗中认可下移58个像素。那正是招致您设置contentOffSet始终不能够正确突显的由来

一网打尽:在ViewDidLoad 中加上那行代码

 self.automaticallyAdjustsScrollViewInsets = NO; //自动滚动调整

更详尽的表达在这里处:

图片 2插手代码之后

骨子里假诺针对地优化一下,这种难题就不会有了。风乐趣的能够看看LazyTableImages这几个官方的事例程序,即使也要从网络下载图片并呈现,但滚动时丝毫不卡。

TableView的图样异步加载错乱和TableView分页

咱俩都知情为了巩固app流畅度,大家不容许把部分疑难的做事放在主线程中去开展,那就能够促成大家的主线程停下来开头施行这个老祸患的操作,主线程会拥塞.大家最简易的想起来升高app响应速度的正是将那个网络有关的操作放在其他线程去异步的实行.那就有了大家接下去的荒诞:<strong>UITableView异步加载图片,图片显示错位</strong>

包括本身不能附着图片来扶助我们越来越好的掌握

分解:TableView叁次只可以呈现5行的图样,在享有图片都加载完后,滚动TableView,让掩瞒在上边包车型客车行显示在显示器上,而那个行的图像会先出示第1行的图形,然后在突显归属它和煦的图样。依此类推,前面包车型客车行都会并发这么的难点!! 就算大家在全部行的图片都还一直不下载完成的时候,滚动TableView,让第11行、12行等出未来显示屏上,但它们依旧会先出示错误的图样,然后再展现准确的图片。那正是漏洞非常多原因TableView的重用机制导致

具体的讲明:

寸草不留办法:

  1. 最简易的艺术:把图纸的url放入cell中,异步加载成功的时等候法庭判果断其url是或不是与cell内的等同,同期再setImage.

细点说你能够自定义cell类,各样cell有温馨的url属性.当您加载图片实现的时候,拿出去url和cell的url属性举办相比.纵然cell是能够选择的,可是每种cell都有独一的url标记.借使五个url相等,那时再去设置图片就足以了

  1. 运用:SDWebImage 直接解决那么些主题材料,不用再关切图片异步等的标题
  • 安装图片圆角:
    // 设置圆角
    _userImageView.layer.cornerRadius = 25;
    _userImageView.layer.masksToBounds = YES;

下边就说说作者对UITableView的询问。可是鉴于自家也是初大方,或然会说错或疏漏一些,因而仅供参照他事他说加以考查。

分页加载

相当多时候我们都以和后台程序员一齐付出程序.由于数量太多,所以选取了分页的不二等秘书籍去把八个宏大的多少分割成一页一页的.那么我们的TableView怎样分页?总是出错?

思路:先同理可得一下思路吧,假使一页数据有13个,那大家的单元格能够安装为13个,最终一个装置为加载越来越多,使用那个法子去接触二回新的互联网央求来获得新的一页的数目.然后再将那个数量增加到我们的数据模型中.

一步步的详细的说:这里以本身的app为例

  1. 先是大家要用二个器皿来存放大家取获得的数据.大家应用NSMutableArray(因为我们之后还要往背后增多卡塔尔(قطر‎

     @interface SceneryViewController () { NSMutableArray *item; //存放数据的可变的容器 }
    
  2. 大家要求填写模型

-getInformatioin{ self.helper = [[AFNetHelper alloc]init]; NSString *baseURL = DATASOURCEURL; item = [NSMutableArray arrayWithCapacity:20]; //初始化模型 for(int i = 0;i < page;i  ) //page:用于记录当前第几页的一个变量,初始化为1 { NSString *url = [NSString stringWithFormat:@"%@%d",baseURL,i 1]; NSLog(@"%@",url); [self.helper modelTransfrom:url block:^(NSString * toJSONString) { NSError * error; self.model = [[SceneryModel alloc]initWithString:toJSONString error:&error]; [item addObjectsFromArray:self.model.data];//填充模型,将我们的数据填进去 }]; } }

3.填充完模型大家需求设置相关的TabelView了

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return 1;}-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return [item count]   1;}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ if(indexPath.row == item.count) { UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cellbasic" forIndexPath:indexPath]; if (page == 3) { cell.textLabel.text = @"没有更多了"; } else { cell.textLabel.text = @"加载更多"; } return cell; } else { SceneryCell * cell = [SceneryCell cellForRowInSceneryCell:indexPath tableView:tableView model:item]; return cell; }}

那正是大家最熟稔的TableViewDataSource 合同了,我们看清当前进是否最终一行.最终一行担当加载数据

4.接下来我们点击末了一行来触发加载下一页的数量取得- tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{if(indexPath.row == [item count]){UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cellbasic" forIndexPath:indexPath];if (page == 3卡塔尔(قطر‎//卤煮这里的分页而为三页,所以page = 3时什么都不利{[tableView deselectRowAtIndexPath:indexPath animated:YES];}else{cell.textLabel.text=@"loading more …";[self performSelectorInBackground:@selector(loadMore withObject:nil]; //在后台实施loadmore方法 那正是我们的加载越来越多[tableView deselectRowAtIndexPath:indexPath animated:YES];NSLog(@"select %ld now indexpath is :%lu ",indexPath.row,(unsigned long)item.count);}

}

5.触发网络伏乞 获取下一页的多少

 -loadMore { page = page 1; NSString *baseURL = DATASOURCEURL; NSString *url = [NSString stringWithFormat:@"%@%d",baseURL,page]; [self.helper modelTransfrom:url block:^(NSString * toJSONString) { NSError * error; SceneryModel *moreData = [[SceneryModel alloc]initWithString:toJSONString error:&error]; NSMutableArray * more = moreData.data; [self performSelectorOnMainThread:@selector(appendTableWith:) withObject:more waitUntilDone:NO]; }]; }

咱俩在后台举办互联网数据的取得,取得了下一页的数目,接下去要加多到大家的容器中.接下来须要在主线程中去举行

6.数目填充

- appendTableWith:(NSMutableArray *)data{ for (int i=0;i<[data count];i  ) { [item addObject:[data objectAtIndex:i]]; } NSMutableArray *insertIndexPaths = [NSMutableArray arrayWithCapacity:10]; for (int ind = 0; ind < [data count]; ind  ) { NSIndexPath *newPath = [NSIndexPath indexPathForRow:[item indexOfObject:[data objectAtIndex:ind]] inSection:0]; [insertIndexPaths addObject:newPath]; } [self.tableview insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationFade];}

大家在填充完了数量之后,还亟需为那几个数量加多IndexPath ,不然你或者现身数组越界的错误. 所以大家立异完模型之后,为那么些数据分配indePath,然后把这一个插入到大家的tableView中.那样大家的分页加载就大功告成了

率先说下UITableView的法规。风野趣的能够看看《About Table Views in iOS-Based Applications》。

末尾AFNetWorking的某些难题

三个陈规陋习的荒谬了:

NSLocalizedDescription=Request failed: unacceptable content-type: text/html}AFNetworking 暗中认可不扶助text/html

在投机的代码处加上那句代码:

manager.responseSerializer.acceptableContentType = [NSSet setWithObject:@"text/html"];setWithObject:@"text/html"];

详细的看这里:

  • 设置点击cell然后不留下点击的划痕:
    // 设置未有印痕
    • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
      {
      [tableView deselectRowAtIndexPath:indexPath animated:YES] ;
      }

UITableView是UIScrollView的子类,因而它能够自行响应滚动事件。

它当中满含0到八个UITableViewCell对象,每一种table cell突显各自的开始和结果。当新cell须求被展现时,就能够调用tableView:cellForRowAtIndexPath:方法来收获或创建八个cell;而不得视时,它又会被保释。简单的讲,同一时间其实只须要存在一屏幕的cell对象就可以,没有必要为每一行创建三个cell。

  • 安装button中图纸和文件的岗位
    button.imageEdgeInsets = UIEdgeInsetsMake(0, -100, 0, 0) ;
    button.titleEdgeInsets = UIEdgeInsetsMake(0, -100, 0, 0) ;

其它,UITableView还足以分成多少个sections,每种区段都足以有温馨的head、foot和cells。而在一定二个cell时,就要求2个字段了:在哪个section,以至在这里个section的第几行。那在iOS SDK中是用NSIndexPath来声明的,UIKit为其增加了indexPathForRow:inSection:那个创制方法。

别的诸如编辑之类的就不提了,因为和本文毫不相关。

  • 延期调用
    // 延迟两分钟调用yanchiAction方法
    [self performSelector:@selector(yanchiAction) withObject:nil afterDelay:0.2] ;

介绍完原理,接下去就起来优化吧。

选用不透明视图。

  • 刷新UICollectionView视图
    [cell setNeedsLayout] ;

  • 设置内填充
    self.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) ;

  • 设置tabBarView 的标签栏未有内填充效果
    self.automaticallyAdjustsScrollViewInsets = NO ;

  • 决断字符串是或不是的发端
    if([context hasPrefix:@"@"]) ;

  • 央浼数据从调整台打字与印刷成data类型的数据实惠开展json深入深入分析
    po operation.responseString

  • 禁止滑动视图滑动
    scrollView.scrollEnabled = NO;

  • 设置超过父视图部分不减切
    _scrollView.clipsToBounds = NO ;

  • 废除UIScrollView的弹性效果
    scrollView.bounces = NO;

  • ScrollView禁绝滑动
    scrollView.scrollEnabled = YES;

  • 看清点击的是哪个视图,再次回到值是个视图
    tap.view.tap

  • 那是tableView未有暗中认可的分界线
    self.separatorStyle = NO ;

  • 子视图当先父视图点击没影响
    (注意:如若父视图是UIScrollView,须求设置self.bgScrollView.clipsToBounds = NO;,因为UIScrollView暗许会实行裁剪,会诱致当先的有的没有了。卡塔尔(قطر‎

不透明的视图能够十分的大地进步渲染的进程。因而如非供给,能够将table cell及其子视图的opaque属性设为YES。

中间的特例满含背景观,它的alpha值应为1(比如不要接受clearColor);图像的阿尔法值也理应为1,或许在水墨画时设为不透明。

  - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    CGPoint hitPoint = [self.cardView.dayRateHelp convertPoint:point fromView:self];
    if ([self.cardView.dayRateHelp pointInside:hitPoint withEvent:event])
        return self.cardView.dayRateHelp;
    return [super hitTest:point withEvent:event];
}

当一个view是晶莹剔透的,iOS必要渲染四个像素四回或频仍,那是因为叁个像素同不经常候归于众多subviews。那是三个非常耗费时间的长河。

  • 用KVC修改UIPageControl的入选图片和暗中同意图片(系统暗中同意是不准改善的)

通过代码或许InterfaceBuilder能够十分轻松的成就。开拓者应该数11遍反省有着的subviews是不透明的。

对此自定义代码,你能够经过代码来安装,如下:

  [self.pageControl setValue:currentImage forKey:@"_currentPageImage"];
  [self.pageControl setValue:pageImage forKey:@"_pageImage"];

view.opaque = YES;

  • 消释文本视图按键
    textField.clearButtonMode = UITextFieldViewModeWhileEditing;

  • 点击单元格不留给点击的印痕

    • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
      {
      [tableView deselectRowAtIndexPath:indexPath animated:YES] ;
      }
  • 安装单元格选中的样式(无样式)
    cell.selectionStyle = UITableViewCellSelectionStyleNone ;

  • 设置标签栏的选择品种文字和图片颜色
    self.tabBar.tintColor = [UIColor redColor] ;

  • 轶闻版创制静态单元格,注意创立的UITableViewControl 文件。m文件中有一部分机关创造的代码时供给删除的,要是是集成于baseTableViewControl也要去除代码
    // 获取有趣的事版
    UIStoryboard *board = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    // 获取视图
    MyTableViewController *myView = [board instantiateViewControllerWithIdentifier:@"MyID"] ;

  • 看清四个词典里是否有有些key
    if([[dic allKeys]containsObject:@"key"])

  • 随机数
    long price = arc4random()*1000 ;

  • 刷新视图
    [label setNeedsDisplay] ;

  • 延迟几分钟实行
    [self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0f];

  • 去掉cell的汾水陵(倘若是用xib做的,侧面也可能有其一个性,设置为none就可以State of Qatar
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

决不再一次创造不要求的table cell。

日前说了,UITableView只需求一显示器的UITableViewCell对象就可以。因而在cell不可知时,能够将其缓存起来,而在须要时继续接纳它就能够。

  • 注销cell选中作用
    tableView.selectionStyle = UITableViewCellSelectionStyleNone;

而UITableView也提供了这种体制,只必要轻巧地安装一个identifier就可以:

static NSString *CellIdentifier = @"xxx";

-   数据发生改变后一定要重新刷新数据  
- (void)viewWillAppear:(BOOL)animated{  

    [super viewWillAppear:animated];  
    /** 
     *  clearsSelectionOnViewWillAppear 
     *  这个是它的一个属性,默认是yes 返回列表页面的时候,默认取消这行的选中状态,可是我们已经把这条数据删除的话,会出问题 
     *  如果你点击了一行cell,进入下一个页面,在这个页面中,我们把本该属于这行cell的数据给删了 
     *  如果  self.clearsSelectionOnViewWillAppear = yes,返回前一页时,会刷新这一行cell,执行cellForRow方法,结果数据却没了,就崩溃了 
     *  如果  self.clearsSelectionOnViewWillAppear = no,不会刷新这一行cell,就没事儿了 
     */  
   self.clearsSelectionOnViewWillAppear =NO;  
    [self.tableView reloadData];---->并不一定要放在这里,看取得数据在什么位置,刷新数据在什么位置  
}  

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

  • awakeFromNib(storyboard)和 viewDidLoad的区别

    • awakeFromNib
    当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的 awakeFromNib函数来响应这个消息,执行一些必要的操作。也就是说通过nib文件创建view对象是执行awakeFromNib 。
    
    • viewDidLoad
    当view对象被加载到内存是就会执行viewDidLoad,所以不管通过nib文件还是代码的方式创建对象都会执行viewDidLoad。awakeFromNib和viewDidLoad的区别
    

if (cell == nil) {

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

  • 将汉字转换为不带音调的拼音

}

值得一说的是,cell被收音和录音时,它里面绘制的剧情并不会被机关清除,因而你大概必要调用setNeedsDisplayInRect:或setNeedsDisplay方法。

- (NSString *)transformMandarinToLatin:(NSString *)string  
{  
    NSMutableString *preString = [string mutableCopy];  
    /*转换成成带音 调的拼音*/  
    CFStringTransform((CFMutableStringRef)preString, NULL, kCFStringTransformMandarinLatin, NO);  
    /*去掉音调*/  
    CFStringTransform((CFMutableStringRef)preString, NULL, kCFStringTransformStripDiacritics, NO);  
    return preString;  
}  

除此以外,在加多table cell的时候,假若不必要动漫效果,最棒不要选择insertRowsAtIndexPaths:withRowAnimation:方法,而是径直调用reloadData方法。因为前端会对具有indexPaths调用tableView:cellForRowAtIndexPath:方法,就算该cell并无需显示(不明了是否bug),那就或许成立大气盈余的cell。改革:只是在模拟器上测验如此,真机调节和测验时未有这种bug。

  • 图片适应难题(超过部分裁剪State of Qatar
    有两个view: view1,view2
    view2加多view1到中,假使view2大于view1,也许view2的坐标不全在view1的界定内,view2是盖着view1的,意思正是高于的部份也会画出来
    UIView有多少个属性,clipsTobounds 暗中认可情状下是NO。
    例如,大家想要view2把超过的那部份蒙蔽起来的话,就得改动它的父视图也就view1的clipsTobounds属性值。
    view1.clipsTobounds = YES;

减色盲图的数量。

UITableViewCell满含了textLabel、detailTextLabel和imageView等view,而你还足以自定义一些视图放在它的contentView里。然则view是相当大的目的,创设它会损耗比较多财富,何况也耳闻则诵渲染的属性。

  • 其三方FMDB数据库操作难点
    Unknown error finalizing or resetting statement (5: database is locked)
    在使用fmdb时不常候一不当心没写好代码就能这么子呀,为何呢,其实呢,应该是在前头代码中有调用数据库而且并未调用[db close]就间接跳出结果来了,所以在前边的数据库操作中先运转[db close]再回来数据就能够;

  • 由此注册键盘展现的音讯

如若您的table cell满含图表,且数额相当多,使用私下认可的UITableViewCell会非常影响属性。古怪的是,使用自定义的view,而非预约义的view,显明会快些。

自然,最棒的消除办法还是世袭UITableViewCell,并在其drawRect:中活动绘制:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShown:)  
name:UIKeyboardWillShowNotification object:nil];  

   - (void)keyboardWillShown:(NSNotification *)aNotification{
  // 键盘信息字典
  NSDictionary *info = [aNotification userInfo];

- drawRect:rect {

}

if {

  • 校正导航栏中间标题颜色

    UIColor * color = [UIColor whiteColor];  
    NSDictionary * dict = [NSDictionary dictionaryWithObject: colorforKey:NSForegroundColorAttributeName];  
    self.navigationController.navigationBar.titleTextAttributes = dict;  
    
  • UIWebView要得以完成横向滑动,跟UIWebview的加强未有涉嫌,你必要设定UIWebView的质量scrollView的contentsize.width大于UIWebView的frame.size.width.

[image drawAtPoint:imagePoint];

self.image = nil;

  • 怎么样监测系统键盘的弹出(有第三方框架很方便卡塔尔(قطر‎
    因此挂号键盘彰显的新闻

} else {

[placeHolder drawAtPoint:imagePoint];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShown:)  

name:UIKeyboardWillShowNotification object:nil];  

- (void)keyboardWillShown:(NSNotification*)aNotification{  
    // 键盘信息字典  
    NSDictionary* info = [aNotification userInfo];  
}  

}

  • 变动状态栏颜色

[text drawInRect:textRect withFont:font lineBreakMode:UILineBreakModeTailTruncation];

在Info.plist 添加

}

UIViewControllerBasedStatusBarAppearance, 设置值为 NO

只是这样一来,你会意识选中一行后,这几个cell就变蓝了,当中的内容就被遮挡了。最简便的法子便是将cell的selectionStyle属性设为UITableViewCellSelectionStyleNone,那样就不会被高亮了。

然后再didFinishLaunchingWithOptions的AppDelegate, 增多那些代码:

其它还足以创立CALayer,将内容绘制到layer上,然后对cell的contentView.layer调用addSublayer:方法。那一个例子中,layer并不会确定影响属性,但一旦layer透明,只怕有圆角、变形等效果,就能潜濡默化到绘制速度了。覆灭办法可参见后边的预渲染图像。

[application setStatusBarHidden:NO];[application setStatusBarStyle:UIStatusBarStyleLightContent];

毫无做多余的绘图专门的学业。

  • 路子截取字符串的有的甩卖

      // 从路径中获得完整的文件名(带后缀)
    
      exestr = [filePath lastPathComponent];
    
      // 获得文件名(不带后缀)
    
      exestr = [exestr stringByDeletingPathExtension];
    
      // 获得文件的扩展类型(不带'.')
    
      exestr = [filePath pathExtension];
    
  • 其三方库不协助陆拾叁个人变成编写翻译错误

在实现drawRect:的时候,它的rect参数便是急需绘制的区域,那些区域之外的无需展开绘图。

本文由新浦京81707con发布于功能介绍,转载请注明出处:iOS开发小冷易忘知识点总结,iOS中UITableView性能优

关键词: 新浦京81707con ios 错误 常见 iOS 开发

上一篇:C的属性修饰符,iOS中几个小知识点整理

下一篇:没有了