你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開辟之級聯界面(推舉界面)搭建道理

iOS開辟之級聯界面(推舉界面)搭建道理

編輯:IOS開發綜合

先看看後果圖:

一.全體結構
 1.項目需求
 點擊右邊cell,左邊的cell數據更新
 2.界面搭建
 2.1交給兩個掌握器治理比擬費事,點擊一個掌握器須要告訴別的一個掌握器
 2. 2是以交給一個掌握器治理比擬好
 2.3用xib搭建,閣下各放一個tableView便可以了
 3.開辟次序
先做右邊的tableView,再做左邊的,由於左邊的數據是依據右邊變更的

 二.右邊tableView界面搭建
 1.自界說cell
 右邊一個指導器歐一個view   中央地位用label
 2.設置數據源
  兩個tableView設置統一個掌握器為數據源和署理,完成辦法的時刻要先斷定tableView的類型
 3.要求數據,檢查接口文檔
 4.字典轉模子
 5.顯示數據
 6.運轉發明一個tableView頂部被蓋住,另外一個沒被蓋住,為何?
 蘋果默許只給界面上一個scrollView設置額定轉動區域,只須要撤消主動設置的額定轉動區域,本身手動設置便可以了
 7.選中cell,讓cell的指導器顯示
 7.1 怎樣完成?
 監聽cell選中,選中就讓指導器顯示
 7.2 然則還要監聽撤消選中,把指導器隱蔽
 7.3 怎樣同時監聽一個cell被選中,另外一個cell撤消選中?
 cell本身有一個辦法可以同時監聽 

// 挪用時辰:當一個cell選中的時刻就會挪用,而且一個cell撤消選中的時刻也會挪用
 - (void)setSelected:(BOOL)selected animated:(BOOL)animated 


7.4 cell不須要選中狀況
self.selectionStyle = UITableViewCellSelectionStyleNone; 

8.點擊右邊cell的時刻,要求左邊tableView的數據
監聽右邊cell的點擊,然後發送收集要求,要求左邊的數據

三.左邊tableView界面搭建
1.xib復用
 xib也能復用,當兩個界面的xib一樣時,可以用統一個xib,只需給xib傳遞分歧的模子便可
2.左邊tableView營業邏輯
3.點擊右邊的cell,發送收集要求,要求左邊的數據
4.要求數據,檢查接口文檔
4.1發明有一個參數category_id 須要依據右邊辦事器前往的id 來加載左邊的數據,所以,我們在右邊tableView的模子中要再加一個id屬性
4.2復用模子,模子也能復用,只須要在本來模子中添加須要數據的屬性便可
5.展現數據,點擊右邊cell,左邊就顯示對應的數據

四.全體數據優化
1.默許選中右邊的第0個cell 

  - (void)selectRowAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;  

2.默許選中第0個cell.寫在哪裡?
2.1寫在viewDidLoad外面?
弗成以,這個時刻還沒稀有據
2.2要寫在數據加載勝利,並且刷新表格以後 

刷新代碼: 

[self.categoryTableView reloadData]; 
// 默許選中第0個cell
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.categoryTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; 

3.手動選中右邊第0個cell,發明左邊數據沒刷新

3.1為何?

由於 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath辦法必需用戶手動點擊cell才會觸發

3.2怎樣處理?
本身去挪用這個辦法,寫在默許選中第0個cell後邊便可以了 

[self tableView:self.categoryTableView didSelectRowAtIndexPath:indexPath]; 

4.數據優化
4.1每次點擊右邊cell,左邊cell都須要發送要求取得數據,消費機能
4.2假如加載過一次,就保留起來,下次就不消再加載了。
4.3保留到哪裡?
保留到對應的分類模子的用戶數組外面,在分類tableView的模子中界說一個用戶數組,保留右邊cell對應的左邊的tableView的數據
4.4 怎樣拿到右邊cell對應的一組模子?
要求左邊數據的時刻,右邊對應的cell必定是被選中的,經由過程記載選中cell對應的模子,就可以拿到這個模子
4.5 在選中左邊cell的辦法中,先斷定模子中user數組(左邊對應的數據數組)能否有值
假如有值,直接刷新表格,然後return,就不在發送收集要求
假如沒有,就發送收集要求,要求勝利後,保留數據,刷新表格,展現數據

五.高低拉刷新 
1.項目需求: 左邊的tableView須要高低拉刷新功效
2.怎樣完成高低拉刷新?
應用 MJRefresh框架
3.下拉刷新,直接加載最新數據,籠罩失落本來的便可以了
我們本來就是直接用模子中的數組,籠罩失落本來的數據,所以就不消做移除本來數據的處置了
4.上拉刷新營業邏輯
4.1上拉刷新,須要加載更多的數據,怎樣加載更多的數據?
須要一個參數(page 或 ID),來取得更多的數據
4.2這個參數(page)辦事器會前往,我們須要記載一下,記載到哪裡?
 應當記載到右邊tableView的模子中,要求更多半據的時刻,從模子中掏出這個參數發送要求
 4.3 下拉刷新的時刻,要對page參數復原
把page重置為1,不然下拉刷新,會加載其它頁碼的數據,到值數據紊亂
4.4 加載更多半據勝利的時刻,我們就要對page +1,由於記載的page  會作為下次要求參數傳遞
留意:只需要求數據,要求勝利的時刻,就要對page + 1
 4.5 上拉刷新,對數據的處置
上拉刷新,須要把本來的數據和新加載的數據一路顯示
4.6 怎樣一路顯示?
用數組保留加載的更多半據,把這個數組中的元素添加到本來數據數組中
4.7,怎樣把一個數組中的元素,添加到另外一個數組中?
經由過程- (void)addObject:(ObjectType)anObject;辦法?
弗成以,這個辦法會把全部數組作為一個元素,添加到另外一個數組中[_selectCategoryItem.users addObject:users];
4.8.那用哪一個辦法? 

  - (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;  

這個辦法會把數組中的每個元素掏出來,添加到另外一個數組中
5.上拉刷新細節處置
5.1 當沒有更多半據的時刻,須要隱蔽上拉刷新控件
5.2 怎樣隱蔽?
 拿到控件設置hidden屬性  self.userTableView.mj_footer.hidden
5.3隱蔽的前提是甚麼?
須要斷定以後用戶組,有無更多用戶
5.4 怎樣斷定?
辦事器前往的數據有一個 total_page屬性,假如以後頁>= total_page就沒有更多半據
5.5須要保留 total_page屬性,保留到哪裡?
保留到右邊tableView的模子中,每次要求勝利,就把 total_page屬性保留到對應的用戶組中
5.6 在刷新表格的時刻,以後的page屬性是  以後頁數+ 1 的值
所以設置上拉刷新隱蔽的前提應當是 : page > total_page
5.7 隱蔽代碼寫在哪裡?
寫在刷新表格以後,MJ刷新框架每次刷新完數據,會主動斷定能否隱蔽,必定要在刷新辦法後設置才有效
5.8 每次點擊右邊cell的時刻,也要斷定能否隱蔽上拉刷新控件,為何?
有能夠數據只要一頁,不斷定的話,就會顯示上拉刷新控件,去刷新的時刻,拿不到更多半據

源代碼

- (void)viewDidLoad {
 [super viewDidLoad];
 
 self.title = @"推舉存眷";
 self.automaticallyAdjustsScrollVieWinsets = NO;
 _categoryTableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
 _userTableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
 // 分類tableView注冊cell
 [_categoryTableView registerNib:[UINib nibWithNibName:@"XMGCategoryCell" bundle:nil] forCellReuseIdentifier:categoryID];
 // 用戶tableView注冊cell
 [_userTableView registerNib:[UINib nibWithNibName:@"XMGSubTagCell" bundle:nil] forCellReuseIdentifier:userID];
 // 要求分類數據
 [self loadCategoryData];
 // 添加高低拉刷新
 [self setupRefreshView]; 
}
- (void)setupRefreshView
{
 // 下拉刷新
 // 當松手,而且下拉刷新完整顯示的時刻,就會觸發下拉刷新
 MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewUserData)];
 header.automaticallyChangeAlpha = YES;
 self.userTableView.mj_header = header;
 
 // 上拉刷新
 MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreUserData)];
 footer.automaticallyHidden = YES;
 self.userTableView.mj_footer = footer;
}
 
- (void)loadCategoryData
{
 AFHTTPSessionManager *mgr = [AFHTTPSessionManager xmg_manager];
 
 NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
 parameters[@"a"] = @"category";
 parameters[@"c"] = @"subscribe";
 
 [mgr GET:XMGBaseUrl parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary * _Nullable responSEObject) {
 NSArray *dictArr = responSEObject[@"list"];
 
 _categorys = [XMGCategoryItem mj_objectArrayWithKeyValuesArray:dictArr];
 
 [self.categoryTableView reloadData];
 
 // 默許選中第0個cell
 NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
 [self.categoryTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
 
 [self tableView:self.categoryTableView didSelectRowAtIndexPath:indexPath];
 
 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
 }];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
 if (tableView == _categoryTableView) { // 顯示分類TableView
 return _categorys.count;
 }
 return _selectCategoryItem.users.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 if (tableView == _categoryTableView) { // 顯示分類TableView
 XMGCategoryCell *cell = [tableView dequeueReusableCellWithIdentifier:categoryID];
 cell.item = _categorys[indexPath.row];
 return cell;
 } 
 XMGSubTagCell *cell = [tableView dequeueReusableCellWithIdentifier:userID];
 cell.user = _selectCategoryItem.users[indexPath.row];
 return cell;
}
 
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
 if (tableView == _categoryTableView) {
 return 44;
 }
 return 60 + 1;
}
// 點擊cell就會挪用
// 必需用戶手動點擊cell才會觸發
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
 if (tableView == _categoryTableView) {
 // 記載選平分類模子
 _selectCategoryItem = _categorys[indexPath.row];
 // 點擊分類cell
 // 斷定之前有無數據
 if (_selectCategoryItem.users.count) {
  [self.userTableView reloadData];
  self.userTableView.mj_footer.hidden = _selectCategoryItem.page > _selectCategoryItem.total_page; 
  return;
 }
 // 要求左邊用戶數據
 [self loadNewUserData]; 
 } 
}

// 沒有更多半據的時刻,隱蔽上拉刷新控件
// 斷定以後分類用戶組 有無更多用戶組
// 加載更多用戶數據
- (void)loadMoreUserData
{
 [self.mgr.tasks makeObjectsPerformSelector:@selector(cancel)];
 
 NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
 parameters[@"a"] = @"list";
 parameters[@"c"] = @"subscribe";
 parameters[@"category_id"] = _selectCategoryItem.id;
 parameters[@"page"] = @(_selectCategoryItem.page);
 
 [self.mgr GET:XMGBaseUrl parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary * _Nullable responSEObject) {
 
 [self.userTableView.mj_footer endRefreshing];
 
 _selectCategoryItem.page++;
 NSArray *dictArr = responseObject[@"list"];
 
 NSArray *users = [XMGUserItem mj_objectArrayWithKeyValuesArray:dictArr];
 
 // 掏出數組中一切元素,添加到新數組
// [_selectCategoryItem.users addObject:users];
 [_selectCategoryItem.users addObjectsFromArray:users];
 
 [self.userTableView reloadData];
 
 // 掌握上拉控件能否顯示,必定要在reloadData以後
 self.userTableView.mj_footer.hidden = _selectCategoryItem.page > _selectCategoryItem.total_page;
 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
 }];
}

// 加載更新用戶數據
- (void)loadNewUserData
{
 _selectCategoryItem.page = 1;
 [self.mgr.tasks makeObjectsPerformSelector:@selector(cancel)];
 
 NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
 parameters[@"a"] = @"list";
 parameters[@"c"] = @"subscribe";
 parameters[@"category_id"] = _selectCategoryItem.id;
 
 [self.mgr GET:XMGBaseUrl parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary * _Nullable responseObject) {
 
 _selectCategoryItem.page++;
 
 // 記載以後分類總頁碼數
 _selectCategoryItem.total_page = [responseObject[@"total_page"] integerValue];
 
 // 停止刷新
 [self.userTableView.mj_header endRefreshing];
 
 NSArray *dictArr = responseObject[@"list"];
 
 _selectCategoryItem.users = [XMGUserItem mj_objectArrayWithKeyValuesArray:dictArr];
 
 [self.userTableView reloadData];
 
 self.userTableView.mj_footer.hidden = _selectCategoryItem.page > _selectCategoryItem.total_page;
 
 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
 }];
}

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐本站。

【iOS開辟之級聯界面(推舉界面)搭建道理】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

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