你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開辟中UITableview控件的根本應用及機能優化辦法

iOS開辟中UITableview控件的根本應用及機能優化辦法

編輯:IOS開發綜合

UITableview控件根本應用

1、一個簡略的豪傑展現法式

NJHero.h文件代碼(字典轉模子)

#import <Foundation/Foundation.h>

@interface NJHero : NSObject
/**
 *  頭像
 */
@property (nonatomic, copy) NSString *icon;
/**
 *  稱號
 */
@property (nonatomic, copy) NSString *name;
/**
 *  描寫
 */
@property (nonatomic, copy) NSString *intro;

- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)heroWithDict:(NSDictionary *)dict;
@end

NJViewController.m文件代碼

#import "NJViewController.h"
#import "NJHero.h"

@interface NJViewController ()<UITableViewDataSource, UITableViewDelegate>
/**
 *  保留一切的豪傑數據
 */
@property (nonatomic, strong) NSArray *heros;
@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end


@implementation NJViewController

#pragma mark - 懶加載
- (NSArray *)heros
{
    if (_heros == nil) {
        // 1.取得全途徑
        NSString *fullPath =  [[NSBundle mainBundle] pathForResource:@"heros" ofType:@"plist"];
        // 2.更具全途徑加載數據
        NSArray *dictArray = [NSArray arrayWithContentsOfFile:fullPath];
        // 3.字典轉模子
        NSMutableArray *models = [NSMutableArray arrayWithCapacity:dictArray.count];
        for (NSDictionary *dict in dictArray) {
            NJHero *hero = [NJHero heroWithDict:dict];
            [models addObject:hero];
        }
        // 4.賦值數據
        _heros = [models copy];
    }
    // 4.前往數據
    return _heros;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // 設置Cell的高度
    // 當每行的cell高度分歧的時刻應用屬性設置cell的高度
    self.tableView.rowHeight = 60;
    self.tableView.delegate = self;
}

#pragma mark - UITableViewDataSource
// 前往若干組
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
// 前往每組有若干行
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.heros.count;
}
// 前往哪一組的哪一行顯示甚麼內容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 1.創立CELL
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
    // 2.設置數據
    // 2.1掏出對應行的模子
    NJHero *hero = self.heros[indexPath.row];
    // 2.2賦值對應的數據
    cell.textLabel.text = hero.name;
    cell.detailTextLabel.text = hero.intro;
    cell.imageView.image = [UIImage imageNamed:hero.icon];
    // 3.前往cell
    return cell;
}
#pragma mark - UITableViewDelegate
/*
// 當每行的cell的高度紛歧致的時刻就應用署理辦法設置cell的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (1 == indexPath.row) {
        return 180;
    }
    return 44;
}
 */

#pragma mark - 掌握狀況欄能否顯示
/**
 *   前往YES代表隱蔽狀況欄, NO相反
 */
- (BOOL)prefeXmlRss/ target=_blank class=infotextkey>XmlRss/ target=_blank class=infotextkey>RsstatusBarHidden
{
    return YES;
}
@end

完成後果:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615463041.png (317×499)

代碼留意點:

(1)在字典轉模子的代碼處用上面的代碼,為可變數組分派dictArray.count個存儲空間,可以進步法式的機能

NSMutableArray *models = [NSMutableArrayarrayWithCapacity:dictArray.count];

(2)設置cell的高度

有三種方法可以設置cell的高度

1) 可以在初始加載辦法中設置,self.tableView.rowHeight = 60;這實用於當每行的cell高度分歧的時刻,應用屬性設置cell的高度。

2)在storyboard中設置,實用於高度分歧

3)當每行的cell的高度紛歧致的時刻就應用署理辦法設置cell的高度

  - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

    if (1 == indexPath.row) {

        return 180;

    }

    return 44;

}

2、cell的一些屬性

代碼示例:

#import "NJViewController.h"
#import "NJHero.h"

@interface NJViewController ()<UITableViewDataSource, UITableViewDelegate>
/**
 *  保留一切的豪傑數據
 */
@property (nonatomic, strong) NSArray *heros;
@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end


@implementation NJViewController

#pragma mark - 懶加載
- (NSArray *)heros
{
    if (_heros == nil) {
        // 1.取得全途徑
        NSString *fullPath =  [[NSBundle mainBundle] pathForResource:@"heros" ofType:@"plist"];
        // 2.更具全途徑加載數據
        NSArray *dictArray = [NSArray arrayWithContentsOfFile:fullPath];
        // 3.字典轉模子
        NSMutableArray *models = [NSMutableArray arrayWithCapacity:dictArray.count];
        for (NSDictionary *dict in dictArray) {
            NJHero *hero = [NJHero heroWithDict:dict];
            [models addObject:hero];
        }
        // 4.賦值數據
        _heros = [models copy];
    }
    // 4.前往數據
    return _heros;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // 設置Cell的高度
    // 當每行的cell高度分歧的時刻應用屬性設置cell的高度
    self.tableView.rowHeight = 60;
    self.tableView.delegate = self;

}

#pragma mark - UITableViewDataSource
// 前往若干組
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
// 前往每組有若干行
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.heros.count;
}
// 前往哪一組的哪一行顯示甚麼內容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 1.創立CELL
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
    // 2.設置數據
    // 2.1掏出對應行的模子
    NJHero *hero = self.heros[indexPath.row];
    // 2.2賦值對應的數據
    cell.textLabel.text = hero.name;
    cell.detailTextLabel.text = hero.intro;
    cell.imageView.image = [UIImage imageNamed:hero.icon];
   
    // 2.3設置cell的幫助視圖
    // cell.AccessoryType =  UITableViewCellAccessoryDisclosureIndicator;
    if (0 == indexPath.row) {
        cell.AccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];
    }else
    {
        cell.accessoryView = [[UISwitch alloc] init];
    }
//    UIButton *btn = [[UIButton alloc] init];
//    btn.backgroundColor = [UIColor redColor];
//    cell.accessoryView = btn;
   
   
    // 2.4設置cell的配景色彩
    cell.backgroundColor = [UIColor blueColor];
   
    // 設置默許狀況的配景
//    UIView *view = [[UIView alloc] init];
//    view.backgroundColor = [UIColor blueColor];
//    cell.backgroundView = view;
   
    UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"buttondelete"]];
    cell.backgroundView = iv;
   
    // 設置選中狀況的配景
    UIView *view2 = [[UIView alloc] init];
    view2.backgroundColor = [UIColor purpleColor];
    cell.selectedBackgroundView = view2;
    // 3.前往cell
    return cell;
}


#pragma mark - 掌握狀況欄能否顯示
/**
 *   前往YES代表隱蔽狀況欄, NO相反
 */
- (BOOL)prefeXmlRss/ target=_blank class=infotextkey>XmlRss/ target=_blank class=infotextkey>RsstatusBarHidden
{
    return YES;
}
@end

完成後果:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615463027.png (320×498)

cell的一些屬性:

(1)設置cell的幫助視圖,設置cell.accessoryView(體系供給了列舉型,也能夠自界說@父類指針指向子類對象);

(2)設置cell的配景色彩,有兩種方法可以設置cell的配景色彩:

經由過程backgroundColor 和 backgroundView都可以設置cell的配景。然則backgroundView 的優先級比 backgroundColor的高,所以假如同時設置了backgroundColor和backgroundView, 那末backgroundView會蓋住backgroundColor

    示例:cell.backgroundColor = [UIColorblueColor];

(3)設置cell默許狀況的配景

  示例1:

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

      view.backgroundColor = [UIColor blueColor];

      cell.backgroundView = view;

  示例2:

    UIImageView *iv = [[UIImageViewalloc] initWithImage:[UIImageimageNamed:@"buttondelete"]];

    cell.backgroundView = iv;(父類指針指向子類對象,可使用圖片用簡略的操作設置壯麗的後果)

(4)設置cell選中狀況的配景

示例:

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

    view2.backgroundColor = [UIColorpurpleColor];

    cell.selectedBackgroundView = view2;

3、tableview的一些屬性

代碼示例:

#import "NJViewController.h"

@interface NJViewController ()<UITableViewDataSource>

@end

@implementation NJViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 1.創立tableview
    UITableView *tableview = [[UITableView alloc] init];
    tableview.frame = self.view.bounds;

    // 2.設置數據源
    tableview.dataSource =self;

    // 3.添加tableview到view
    [self.view addSubview:tableview];
   
    // 4.設置朋分線款式
    // tableview.separatorStyle = UITableViewCellSeparatorStyleNone;

    // 5.設置朋分線色彩
     吸收的參數是色彩的比例值
    tableview.separatorColor = [UIColor colorWithRed:0/255.0 green:255/255.0 blue:0/255.0 alpha:255/255.0];
   
    // 設置tableview的頭部視圖
    tableview.tableHeaderView = [UIButton buttonWithType:UIButtonTypeContactAdd];
    tableview.tableFooterView = [[UISwitch alloc] init];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 10;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 1.創立cell
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

    // 2.設置cell的數據
    cell.textLabel.text = [NSString stringWithFormat:@"%d", indexPath.row ];

    // 3.前往cell
    return cell;
}

- (BOOL)prefeXmlRss/ target=_blank class=infotextkey>RsstatusBarHidden
{
    return YES;
}
@end

完成後果:

2015121492531415.png (319×500)

tableview的一些屬性:

(1)設置朋分款式(tableview.separatorStyle),這是個列舉類型

(2)設置朋分線的色彩,可以直接應用體系給出的色彩,假如體系給定的色彩不克不及知足需求時,也能夠自界說。

  彌補:色彩分為24位和32位的,以下

  24bit色彩

     R 8bit 0 ~ 255

     G 8bit 0 ~ 255

     B 8bit 0 ~ 255

    

     32bit色彩

     A 8bit 0 ~ 255(tou)

     R 8bit

     G 8bit

     B 8bit

    

     #ff ff ff 白色

     #00 00 00 黑色

     #ff 00 00 白色

     #255 00 00

  

設置為自界說色彩的實例: tableview.separatorColor = [UIColorcolorWithRed:0/255.0green:255/255.0blue:0/255.0alpha:255/255.0];

 //吸收的參數是色彩的比例值

 (3)設置頂部和底部視圖

tableview.tableHeaderView   //頂部

tableview.tableFooterView    //底部

UITableviewcell的機能成績
1、UITableviewcell的一些引見

UITableView的每行都是一個UITableViewCell,經由過程dataSource的 tableView:cellForRowAtIndexPath:辦法來初始化每⼀行

UITableViewCell外部有個默許的子視圖:contentView,contentView是UITableViewCell所顯示內容的父視圖,可顯示一些幫助指導視圖

幫助指導視圖的作⽤是顯示一個表現舉措的圖標,可以經由過程設置UITableViewCell的 accessoryType來顯示,默許是UITableViewCellAccessoryNone(不顯⽰示幫助指⽰示視圖), 其他值以下:

UITableViewCellAccessoryDisclosureIndicator

UITableViewCellAccessoryDetailDisclosureButton

UITableViewCellAccessoryCheckmark

還可以經由過程cell的accessoryView屬性來自界說幫助指導視圖(⽐如往左邊放一個開關)

2、成績

  cell的任務:在法式履行的時刻,能看到若干條,它就創立若干條數據,假如視圖轉動那末再創立新顯示的內容。(體系主動挪用)。即當一個cell湧現在視野規模內的時刻,就會挪用創立一個cell。如許的邏輯看上去沒有甚麼成績,然則真的沒有任何成績嗎?

  當創立挪用的時刻,我們應用nslog打印新聞,並打印創立的cell的地址。我們發明假如數據量異常年夜,用戶在短時光內往返轉動的話,那末會創立年夜量的cell,一向開拓空間,且假如是往回滾,經由過程打印地址,我們會發明它並沒有重用之前曾經創立的cell,而是從新創立,開拓新的存儲空間。

  那有無甚麼好的處理方法呢?

3、cell的重用道理

(1) IOS裝備的內存無限,假如用UITableView顯示不計其數條數據,就須要不計其數 個UITableViewCell對象的話,那將會耗盡IOS裝備的內存。要處理該成績,須要重用UITableViewCell對象

(2)重⽤道理:當轉動列表時,部門UITableViewCell會移出窗口,UITableView會將窗口外的UITableViewCell放入一個對象池中,期待重用。當UITableView請求dataSource前往 UITableViewCell時,dataSource會先檢查這個對象池,假如池中有未應用的 UITableViewCell,dataSource則會用新的數據來設置裝備擺設這個UITableViewCell,然後前往給 UITableView,從新顯示到窗口中,從而防止創立新對象 。如許可讓創立的cell的數目保持在很低的程度,假如一個窗口中只能顯示5個cell,那末cell重用以後,只須要創立6個cell就夠了。

(3)留意點:還有⼀個異常主要的成績:有時刻須要自界說UITableViewCell(用⼀個子類繼 承UITableViewCell),並且每⼀行⽤的紛歧定是統一種UITableViewCell,所以一 個UITableView能夠具有分歧類型的UITableViewCell,對象池中也會有許多分歧類型的 UITableViewCell,那末UITableView在重⽤用UITableViewCell時能夠會獲得毛病類型的 UITableViewCell

處理⽅計劃:UITableViewCell有個NSString *reuseIdentifier屬性,可以在初始化UITableViewCell的時刻傳入一個特定的字符串標識來設置reuseIdentifier(普通用UITableViewCell的類名)。當UITableView請求dataSource前往UITableViewCell時,先 經由過程一個字符串標識到對象池中查找對應類型的UITableViewCell對象,假如有,就重用,假如沒有,就傳入這個字符串標識來初始化⼀一個UITableViewCell對象。

圖片示例:

2015121492630136.png (758×461)

解釋:一個窗口放得下(可視)三個cell,全部法式只須要創立4個該類型的cell便可。

4、cell的優化代碼

 代碼示例:

#import "NJViewController.h"
#import "NJHero.h"

// #define ID @"ABC"

@interface NJViewController ()<UITableViewDataSource, UITableViewDelegate>
/**
 *  保留一切的豪傑數據
 */
@property (nonatomic, strong) NSArray *heros;
@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end


@implementation NJViewController

#pragma mark - 懶加載
- (NSArray *)heros
{
    if (_heros == nil) {
        // 1.取得全途徑
        NSString *fullPath =  [[NSBundle mainBundle] pathForResource:@"heros" ofType:@"plist"];
        // 2.更具全途徑加載數據
        NSArray *dictArray = [NSArray arrayWithContentsOfFile:fullPath];
        // 3.字典轉模子
        NSMutableArray *models = [NSMutableArray arrayWithCapacity:dictArray.count];
        for (NSDictionary *dict in dictArray) {
            NJHero *hero = [NJHero heroWithDict:dict];
            [models addObject:hero];
        }
        // 4.賦值數據
        _heros = [models copy];
    }
    // 4.前往數據
    return _heros;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // 設置Cell的高度
    // 當每行的cell高度分歧的時刻應用屬性設置cell的高度
    self.tableView.rowHeight = 160;
}

#pragma mark - UITableViewDataSource
// 前往若干組
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
// 前往每組有若干行
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.heros.count;
}
// 當一個cell湧現視野規模內的時刻就會挪用
// 前往哪一組的哪一行顯示甚麼內容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 界說變量保留重用標志的值
    static NSString *identifier = @"hero";
   
//    1.先去緩存池中查找能否有知足前提的Cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
//    2.假如緩存池中沒有相符前提的cell,就本身創立一個Cell
    if (cell == nil) {
        //    3.創立Cell, 而且設置一個獨一的標志
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
        NSLog(@"創立一個新的Cell");
    }
//    4.給cell設置數據
    NJHero *hero = self.heros[indexPath.row];
    cell.textLabel.text = hero.name;
    cell.detailTextLabel.text = hero.intro;
    cell.imageView.image = [UIImage imageNamed:hero.icon];
   
   //  NSLog(@"%@ - %d - %p", hero.name, indexPath.row, cell);
   
    // 3.前往cell
    return cell;
}

#pragma mark - 掌握狀況欄能否顯示
/**
 *   前往YES代表隱蔽狀況欄, NO相反
 */
- (BOOL)prefersStatusBarHidden
{
    return YES;
}
@end

緩存優化的思緒:

(1)先去緩存池中查找能否有知足前提的cell,如有那就直接拿來

(2)若沒有,就本身創立一個cell

(3)創立cell,而且設置一個獨一的標志(把屬於“”的給蓋個章)

(4)給cell設置數據

留意點:

界說變量用來保留重用標志的值,這裡不推舉應用宏(#define來處置),由於該變量只在這個感化域的外部應用,且假如應用宏界說的話,界說和應用地位太疏散,晦氣於浏覽法式。因為其值不變,沒有需要每次都開拓一次,所以用static界說為一個靜態變量。

【iOS開辟中UITableview控件的根本應用及機能優化辦法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved