1. 程式人生 > >iOS---tabletableView的單選(系統對勾) 自定義的單選(自定義圖片)

iOS---tabletableView的單選(系統對勾) 自定義的單選(自定義圖片)

轉自: https://blog.csdn.net/qq_36747738/article/details/60867635

轉自: https://blog.csdn.net/qq_29284809/article/details/50057989

//選擇轉賬使用者對勾

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

NSInteger newRow = [indexPathrow];

NSInteger oldRow = (_lastPath ==nil)?[_lastPathrow]:-1;

if (newRow != oldRow) {

UITableViewCell *newCell = [tableViewcellForRowAtIndexPath:indexPath];

        newCell.accessoryType =UITableViewCellAccessoryCheckmark;

UITableViewCell *oldCell = [tableViewcellForRowAtIndexPath:_lastPath];

        oldCell.accessoryType =UITableViewCellAccessoryNone;

_lastPath = indexPath;

    }

    [tableView 

deselectRowAtIndexPath:indexPathanimated:YES];

_selectSourceM  = _dataSourceM[newRow];

}

下面是自定義的單選

建立Model 設定個BOOL值

#import <Foundation/Foundation.h>

@interface Model : NSObject

@property(nonatomicassignBOOL isSelected;

@end

cell.h

#import <UIKit/UIKit.h>

@classModel;

@interface LYTableViewCell : 

UITableViewCell

@property (weaknonatomicIBOutletUIButton *btn;

@property(assignnonatomic)NSInteger clickCount;

- (void)cellWithData:(Model *)model;


自定義cell .m

- (void)cellWithData:(Model *)model {

if (model.isSelected) {

        [self.btnsetBackgroundImage:[UIImageimageNamed:@"選中"forState:UIControlStateNormal];

    } else {

        [self.btnsetBackgroundImage:[UIImageimageNamed:@"未選中"forState:UIControlStateNormal];

    }

}

tableView 中盡享單選處理

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    [cell.btnaddTarget:selfaction:@selector(ClickBtn:) forControlEvents:UIControlEventTouchUpInside];

cell.btn.tag = indexPath.row;

Model *model =self.arrays[indexPath.row];

    [cellcellWithData:model];

returncell;

}

-(void)ClickBtn:(UIButton *)btn

{

if (self.selectModel) {

self.selectModel.isSelected = !self.selectModel.isSelected;

    }

Model *model = self.arrays[btn.tag];

if (!model.isSelected) {

        model.isSelected = !model.isSelected;

self.selectModel = model;

    }

    [self.tableViewreloadData];

}

最近在做一個頁面關於UITableViewCell的單選,就是選中某行時後面有對勾或者是標記選中的那行,整理了一下,方便各大網友。下面就說下實現的方法。 
第一種的實現 
在.m的檔案裡:

#import "MyViewController.h"
#import "NextViewController.h"

@interface MyViewController ()<UITableViewDataSource,UITableViewDelegate>

@property (nonatomic, strong)UITableView * tableView;
@property (nonatomic, assign)BOOL ifSelected;//是否選中
@property (nonatomic, strong)NSIndexPath * lastSelected;//上一次選中的索引

@end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在viewDidLoad裡面的實現:

    self.ifSelected = NO;//是否被選中 預設為NO
  • 1
  • 2

在TableView資料來源方法裡面:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString * cellIndentifier = @"cell";
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellIndentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIndentifier];
    }
    if (indexPath.row == 0) {
        cell.textLabel.text = @"男";
    }else{
        cell.textLabel.text = @"女";
    }
    if (self.ifSelected) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }else{
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    return cell;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在tableview代理方法裡面:

#pragma mark -tableView代理方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSIndexPath * temp = self.lastSelected;//暫存上一次選中的行
    if (temp && temp != indexPath)//如果上一次的選中的行存在,並且不是當前選中的這一行,則讓上一行不選中
    {
        self.ifSelected = NO;//修改之前選中的cell的資料為不選中
        [tableView reloadRowsAtIndexPaths:@[temp] withRowAnimation:UITableViewRowAnimationAutomatic];//重新整理該行
    }
    self.lastSelected = indexPath;//選中的修改為當前行
    self.ifSelected = YES;//修改這個被選中的一行
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];//重新重新整理
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

實現的效果圖: 
這裡寫圖片描述 
第二種實現方法 
.m檔案裡面:

#import "AdViewController.h"
#import "NextViewController.h"

@interface AdViewController ()<UITableViewDataSource,UITableViewDelegate>
@property (nonatomic, strong)UITableView * tableView;
@property (nonatomic, retain) NSIndexPath *selectedIndexPath;

@end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在TableView資料來源裡面的方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString * cellIndentifier = @"cell";
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellIndentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIndentifier];
    }
    if ([self.selectedIndexPath isEqual:indexPath]){

        cell.accessoryType = UITableViewCellAccessoryCheckmark;

    }else{

        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    return cell;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在tableView代理方法裡面:

#pragma mark -tableView代理方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.selectedIndexPath) {

        UITableViewCell *cell = [tableView cellForRowAtIndexPath:self.selectedIndexPath];

        cell.accessoryType = UITableViewCellAccessoryNone;

    }

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    cell.accessoryType = UITableViewCellAccessoryCheckmark;

    self.selectedIndexPath = indexPath;
}