(一二四)tableView的多組數據展示和手動排序

最近在寫一個輕量級的網絡游戲,遇到了技能優先順序手動排序的需求,我就想到了iOS自帶的tableView編輯功能,對其進行了初步探索,最后做出的效果如下圖所示:

點擊左邊可以刪除,拖住右邊可以手動排序,要實現這個功能,分以下步驟。

①用plist存儲這些數據,可以看到數據分兩個職業,每個職業4個技能,因此建立如下的plist結構:

②因為每個職業除了技能還有名稱這個屬性,因此應該用職業模型保存一個職業的所有數據,再用一個數組保存所有職業模型,職業模型的定義如下:

#import <Foundation/Foundation.h>@interface Vocation : NSObject@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSMutableArray *skills;+ (instancetype)vocationWithDict:(NSDictionary *)dict;@end
需要注意的是這里沒有利用系統實現KVC,因為如果采用系統自帶的,在把plist中的NSArray傳給NSMutableArray時,因為NSMutableArray沒有初始化 ,所以就變成了不可變的數組,這樣為后面的順序調整帶來了致命的問題,因此我們手動實現KVC,用NSArray初始化一個NSMutableArray
#import "Vocation.h"@implementation Vocation+ (instancetype)vocationWithDict:(NSDictionary *)dict{Vocation *vc = [[Vocation alloc] init];vc.title = dict[@"title"];vc.skills = [NSMutableArray arrayWithArray:dict[@"skills"]];return vc;}@end
③使用一個TableViewController,并且實現下面的代碼:

#import "TableViewController.h"
#import "Vocation.h"@interface TableViewController ()@property (nonatomic, strong) NSArray *vocations;@end@implementation TableViewController- (void)viewDidAppear:(BOOL)animated{[super viewDidAppear:animated];self.editing = YES;}- (BOOL)prefersStatusBarHidden{return YES;}- (NSArray *)vocations{if (_vocations == nil) {NSString *path = [[NSBundle mainBundle] pathForResource:@"skillList.plist" ofType:nil];NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];NSMutableArray *vocations = [NSMutableArray array];for (NSDictionary *dict in dictArray) {Vocation *vc = [Vocation vocationWithDict:dict];[vocations addObject:vc];}_vocations = vocations;}return _vocations;}- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{return self.vocations.count;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{Vocation *vc = self.vocations[section];return vc.skills.count;}- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{Vocation *vc = self.vocations[section];return vc.title;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{static NSString  *ID = @"vocation";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];}// 在這里設置cell數據Vocation *vc = self.vocations[indexPath.section];cell.textLabel.text = vc.skills[indexPath.row];return cell;}- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{if (sourceIndexPath.section != destinationIndexPath.section) {[self.tableView reloadData];return;}Vocation *vc = self.vocations[sourceIndexPath.section];[vc.skills exchangeObjectAtIndex:sourceIndexPath.row withObjectAtIndex:destinationIndexPath.row];}- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{if (editingStyle == UITableViewCellEditingStyleDelete) {Vocation *vc = self.vocations[indexPath.section];[vc.skills removeObjectAtIndex:indexPath.row];}[self.tableView reloadData];}- (IBAction)editClick:(id)sender {UIBarButtonItem *btn = sender;if ([btn.title isEqualToString:@"調整"]) {btn.title = @"確定";self.editing = YES;}else{btn.title = @"調整";self.editing = NO;[self.tableView reloadData];}}@end
在這其中,editClick:對應了NavigationBar上的按鈕,用于切換編輯和非編輯狀態。

通過tableViewController的editing方法控制是否進入編輯狀態。

要實現拖動排序,需要實現下面的方法,否則不能拖動,在這個方法中可以獲取到起始和終止位置。

需要注意的是移動只是單純的視覺效果,實際的數據源變化需要自己調整,否則在重新加載數據后又會回到原來的順序,可通過數組的exchangeObjectAtIndexPath::方法調整

為了避免組間移動,這里進行了判斷,發現非法移動直接重置數據。

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{if (sourceIndexPath.section != destinationIndexPath.section) {[self.tableView reloadData];return;}Vocation *vc = self.vocations[sourceIndexPath.section];[vc.skills exchangeObjectAtIndex:sourceIndexPath.row withObjectAtIndex:destinationIndexPath.row];}


轉載于:https://www.cnblogs.com/aiwz/p/6154047.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374610.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374610.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374610.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ARC_xp_20160530

1、 申請內存的地方在哪里&#xff1f;忘了...(應該是用的 malloc) 2、 鍵盤上按下一個鍵&#xff0c;處理的函數為&#xff1a;(所在的模塊 應該是“CEGUIIrrlichtRenderer.dll”) 003B465F CC INT3 003B4660 /$ 53 PUSH EBX 003B4661 |. 56 …

Hibernate映射集合性能問題

首先&#xff0c;這篇文章的靈感來自于Burt Beckwith在2011年1月27日于SpringOne 2GX上發表的有關高級GORM –性能&#xff0c;定制和監控的演講 。 簡而言之&#xff0c; Burt Beckwith討論了使用映射集合和GORM中的Hibernate 2級緩存的潛在性能問題&#xff0c;以及避免此類性…

算法:1!+(1!+3!)+(1!+3!+5!) + ( 1! + 3! + 5! + 7! + 9!)+....+(1!+3!+5!+ ... + m!)...

-(void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event{ //算法入口 [self func2:9]; } //計算階乘 factor&#xff08;m&#xff09;&#xff1d; m&#xff01; -(int)factor:(int)m{ int factorNum0; if(m0|m1) return 1; e…

知道這 20 個正則表達式,能讓你少寫 1,000 行代碼

CocoaChina05-13正則表達式&#xff0c;一個十分古老而又強大的文本處理工具&#xff0c;僅僅用一段非常簡短的表達式語句&#xff0c;便能夠快速實現一個非常復雜的業務邏輯。熟練地掌握正則表達式的話&#xff0c;能夠使你的開發效率得到極大的提升。下面是技匠整理的&#x…

用Jackson進行Java JSON處理

JSON &#xff08;Javascript對象符號&#xff09;正成為一種非常流行的數據交換格式。 在使用諸如YUI&#xff0c;ExtJS&#xff0c;DOJO等Javascript框架開發Web應用程序時&#xff0c;我們可以使用XML或JSON在客戶端和服務器之間交換數據。 通常&#xff0c;我們從服務器獲得…

Android Togglebutton 默認背景被放大

1 . 最近在項目中自定義toggleButton 發現背景圖放入后 &#xff0c;比美工給我的原圖要大很大 2. 為什么&#xff1f; 3.比較ToggleButton 和TextView源碼 發現, toggleButton 設置了minWidth 和minHeigh &#xff0c;導致我的背景小圖被拉伸。 4.解決這種問題&#xff1a; 重…

MapReduce:簡單介紹

MapReduce是Google流行的一種并行編程技術。 它用于處理大量數據。 僅通過將工作并行分配給多臺機器&#xff0c;就可以在合理的時間內完成這種處理。 每臺機器都處理一小部分數據。 MapReduce是一種編程模型&#xff0c;使開發人員可以專注于編寫處理數據的代碼&#xff0c;而…

python翻譯詞典實例

#!/usr/bin/python # -*- coding:utf-8 -*- #通過有道翻譯來進行內容翻譯 import urllib2 import urllib import json #---------翻譯方法定義 start---------# def transfer( transferStr , lanSource auto ): data {type:lanSource,i:transferStr,doctype:json,xmlVersion:1…

元素分類--塊級元素(特點:獨占一行, 寬高邊距可改)

什么是塊級元素&#xff1f;在html中<div>、 <p>、<h1>、<form>、<ul> 和 <li>就是塊級元素。設置display:block就是將元素顯示為塊級元素。如下代碼就是將內聯元素a轉換為塊狀元素&#xff0c;從而使a元素具有塊狀元素特點。 a{display:b…

Java應用程序中的消息傳遞主體

消息傳遞是每個Java應用程序的關鍵方面&#xff0c;尤其是對于涉及企業應用程序集成&#xff08;EAI&#xff09;或關注點分離的應用程序&#xff0c;例如多層WEB應用程序。 消息傳遞可以分為兩個主要類別&#xff0c;即同步和異步。 另一方面&#xff0c;使用同步消息傳遞時&…

站立會議05(第二次沖刺)

一、站立會議信息&#xff08;配站立會議照片&#xff09; 第五天我們繼續開發&#xff0c;把注冊驗證信息完善一下&#xff0c;將開始網站公共主頁的開發。 二、任務進度 第五天我們注冊驗證完成。 三、任務看板&#xff08;圖&#xff09; 四、燃盡圖&#xff08;圖&#xff…

[SoapUI] DataSource, DataSourceLoop, DataSink

Script assertion in login: 轉載于:https://www.cnblogs.com/MasterMonkInTemple/p/4748189.html

1154. 一年中的第幾天

給你一個字符串 date &#xff0c;按 YYYY-MM-DD 格式表示一個 現行公元紀年法 日期。請你計算并返回該日期是當年的第幾天。 通常情況下&#xff0c;我們認為 1 月 1 日是每年的第 1 天&#xff0c;1 月 2 日是每年的第 2 天&#xff0c;依此類推。每個月的天數與現行公元紀年…

將CAPTCHA添加到您的GWT應用程序

什么是驗證碼&#xff1f; 在一個充滿惡意機器人的世界中&#xff0c;您該怎么做才能保護您寶貴的Web應用程序&#xff1f; 您真正應該做的基本事情之一就是向其中添加CAPTCHA功能。 如果您不熟悉&#xff08;聽起來有些奇怪&#xff09;&#xff0c;則CAPTCHA是確保用戶實際上…

SQL基礎語句

數據庫面試常見題 一、SQL語言包括數據定義語言、數據操作語言、數據控制語言和事務控制語言1&#xff1a;DDL(Data Definition Language)&#xff0c;是用于描述數據庫中要存儲的現實世界實體的語言。 CREATE TABLE - 創建新表 ALTER TABLE - 變更&#xff08;改變&#xff0…

YYModel Summary

YYModel Effect-> YYModel的作用Provide some data-model method—>提供一些數據模型的方法Convert json to any object, or convert any object to json.->對任何對象轉換成JSON&#xff0c;和對任何JSON轉換為對象Set object properties with a key-value dictionar…

iOS學習——ScrollView圖片輪播和同類控件優先級問題

iOS學習——ScrollView的使用和同類控件優先級問題 1. 布置界面 ScrollView的使用非常簡單&#xff0c;只有三步 1.1 添加一個scrollview 1.2 向scrollview添加內容 1.3 告訴scrollview中內容的實際大小 首先做第一步&#xff0c;布置界面。 拖拽一個scrollview就可以了 就…

Exchanger和無GC的Java

總覽 Exchanger類在線程之間傳遞工作和回收使用的對象方面非常有效。 AFAIK&#xff0c;它也是最少使用的并發類之一。 但是&#xff0c;如果您不需要GC&#xff0c;則使用ArrayBlockingQueue進行日志記錄會更簡單。 交換器類 Exchanger類對于在兩個線程之間來回傳遞數據很有…

構造函數的反射

1 import java.lang.reflect.Constructor;2 3 public class zzbds {4 public static void main(String[] args) {5 6 try{ 7 Class cStudent.class; //獲得無參構造函數8 Constructor constructorc.getConstructor(new Class[]{…

字符串連接“+”int、char、string

String s1 "21" "8" "54";System.out.println(s1);String s2 "21" 8 "54";System.out.println(s2);String s3 "21" 8 "54";System.out.println(s3);21854 21854 21854