你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS_13_tableView的編輯模式_紅樓夢

iOS_13_tableView的編輯模式_紅樓夢

編輯:IOS開發綜合

最終效果圖:

\


Girl.h

<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHByZSBjbGFzcz0="brush:java;">// // Girl.h // 12_tableView的增刪改 // // Created by beyond on 14-7-27. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import @interface Girl : NSObject // UI控件用weak,字符串用copy,其他對象用strong // 頭像圖片名 @property(nonatomic,copy)NSString *headImgName; // 姓名 @property(nonatomic,copy)NSString *name; // 判詞 @property(nonatomic,copy)NSString *verdict; // 提供一個類方法,即構造函數,返回封裝好數據的對象(返回id亦可) + (Girl *)girlNamed:(NSString *)name headImgName:(NSString*)headImgName verdict:(NSString *)verdict; // 類方法,字典 轉 對象 類似javaBean一次性填充 + (Girl *)girlWithDict:(NSDictionary *)dict; // 對象方法,設置對象的屬性後,返回對象 - (Girl *)initWithDict:(NSDictionary *)dict; @end

Girl.m

//
//  Girl.m
//  12_tableView的增刪改
//
//  Created by beyond on 14-7-27.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "Girl.h"

@implementation Girl
// 提供一個類方法,即構造函數,返回封裝好數據的對象(返回id亦可)
+(Girl *)girlNamed:(NSString *)name headImgName:(NSString *)headImgName verdict:(NSString *)verdict
{
    Girl *girl = [[Girl alloc]init];
    girl.name = name;
    girl.headImgName = headImgName;
    girl.verdict = verdict;
    return girl;
}

// 類方法,字典 轉 對象 類似javaBean一次性填充
+ (Girl *)girlWithDict:(NSDictionary *)dict
{
    // 只是調用對象的initWithDict方法,之所以用self是為了對子類進行兼容
    return [[self alloc]initWithDict:dict];
}

// 對象方法,設置對象的屬性後,返回對象
- (Girl *)initWithDict:(NSDictionary *)dict
{
    // 先調用父類NSObject的init方法
    if (self = [super init]) {
        // 設置對象自己的屬性
        self.name = dict[@"name"]   ;
        self.headImgName = dict[@"headImg"] ;
        self.verdict = dict[@"verdict"];
    }
    // 返回填充好的對象
    return self;
}
@end


BeyondViewController.h

//
//  BeyondViewController.h
//  13_tableView的編輯模式
//
//  Created by beyond on 14-7-28.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import 

@interface BeyondViewController : UIViewController
// 點擊 刪除,進入編輯模式之刪除 模式
- (IBAction)trashBtnClick:(UIBarButtonItem *)sender;
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *trashBtn;

@end


BeyondViewController.m

//
//  BeyondViewController.m
//  13_tableView的編輯模式
//
//  Created by beyond on 14-7-28.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "BeyondViewController.h"
#import "Girl.h"
@interface BeyondViewController ()
{
    // 從plist文件中加載的所有girls,返回字典數組
    NSArray *_arrayWithDict;
    // 所有的對象數組
    NSMutableArray *_girls;
}
@end

@implementation BeyondViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"view did load");
    // 所有的對象數組
    _girls = [NSMutableArray array];
    
    // 調用自定義方法,加載plist文件
    [self loadPlist];
    
	
}
// 自定義方法,加載plist文件
- (void)loadPlist
{
    // sg_bundle模板代碼,1,獲得.app主要的包;2,返回主要的包中某個文件的fullPath全路徑
    NSBundle *mainBundle = [NSBundle mainBundle];
    NSString *fullPath = [mainBundle pathForResource:@"girls.plist" ofType:nil];
    
    // 從plist文件中根據全路徑,返回字典數組
    _arrayWithDict = [NSArray arrayWithContentsOfFile:fullPath];
    
    // 再調用自定義方法,將字典數組,轉換成對象數組
    [self dictArrayToModelArray];
    
}
// 自定義方法,將字典數組,轉換成對象數組
- (void)dictArrayToModelArray
{
    // 字典數組 _arrayWithDict
    
    // 方式2:類方法返回對象,參數只要一個字典數組即可
    for (NSDictionary *dict in _arrayWithDict) {
        // 參數只要字典,這樣一來,控制器就不用知道太多東西了
        // Girl *girl = [[Girl alloc]initWithDict:dict];
        Girl *girl = [Girl girlWithDict:dict];
        
        [_girls addObject:girl];
    }
}



// 點擊刪除按鈕,進入編輯模式
- (IBAction)trashBtnClick:(UIBarButtonItem *)sender {
    // 如果正在編輯,則取消編輯,否則 開始編輯
    if ([_tableView isEditing]) {
        //_tableView.editing = NO;
        [_tableView setEditing:NO animated:YES];
    } else {
        //_tableView.editing = YES;
        [_tableView setEditing:YES animated:YES];
    }
}

#pragma mark - 代理方法
// 編輯模式下,點擊一行的自帶的刪除按鈕時調用代理的該commitEditing方法,並且,只要實現了該方法之後,只要手指在屏幕上向左滑動,就會自動進入編輯模式,彈出cell中的刪除 按鈕
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"commitEditing---row--%d",indexPath.row);
    // 獲取編輯模式
    UITableViewCellEditingStyle style = editingStyle;
    // 獲取要刪除的行
    int row = indexPath.row;
    // 如果是刪除模式,才往下進行
    if (style != UITableViewCellEditingStyleDelete) {
        return ;
    }
    // 先修改數據 模型,再更新(如果對象數組中刪除了一些對象,則只能調用tableView的deleteRowsAtIndexPaths方法,否則報錯)
    [_girls removeObjectAtIndex:row];
    [_tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    

    
    // 調用自定義方法,負責按鈕標題等狀態檢查
    [self statusCheck];
    
}
// 自定義方法,負責按鈕標題等狀態檢查
- (void)statusCheck
{
    // 如果沒有東西可以刪除,則刪除 按鈕禁用
    if (_girls.count == 0) {
        _trashBtn.enabled = NO;
    }
}
// 代理方法,排序,moveRow
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
    // 只要實現此方法,就可以自動拖拽cell進行排列了
    
    //修改數據,等到再次顯示的時候,調用cellForRow就會依然按最新的順序正確顯示了
    Girl *girl = [_girls objectAtIndex:sourceIndexPath.row];
    [_girls removeObject:girl];
    [_girls insertObject:girl atIndex:destinationIndexPath.row];
    
}
// 代理方法,點擊行時,取消點擊時的高亮的背景顏色
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [_tableView deselectRowAtIndexPath:indexPath animated:YES];
}
#pragma mark - 數據源方法
// 數據源方法,每一組,有多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // 返回數組中對應的對象個數
    return _girls.count;
}
// 數據源方法,每一組的每一行應該顯示怎麼的界面(含封裝的數據),重點!!!必須實現否則,Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"Beyond";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    if (cell == nil) {
        // 如果池中沒取到,則重新生成一個cell
        /*
         cell的4種樣式:
         1,default   左圖右文字
         2,subtitle  左圖  上文字大    下文字小
         3,value 1   左圖  左文字大    右文字小
         3,value 2   惡心  左文字小    右文字大
         */
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];
    }
    // 設置cell中獨一無二的內容
    Girl *girl = [_girls objectAtIndex:indexPath.row];
    cell.textLabel.text = girl.name;
    cell.imageView.image = [UIImage imageNamed:girl.headImgName];
    cell.detailTextLabel.text = girl.verdict;
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    // 返回cell
    return cell;
}
// 代理方法,每一行的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 83;
}
@end


\



顯示界面默認的英文改成中文


\



girls.plist

\


如果數據源(即對象數組)和tableView的row 刪除不統一,就會報錯

\



cell中的其實還有一個中間件contentView









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