2013-11-26 33 views
0

我爲每個視單元創建了自定義按鈕(每個單元格1個)。當滾動UITableView時,一些視單元有2個按鈕,但這並不是有意的。我沒有看到我的方式中的錯誤。UITableView按鈕在滾動時複製

請幫忙!

圖片:http://s18.postimg.org/v7djg84ah/buttons_App.png

頁眉:

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController <UITableViewDataSource> 

- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView; 

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section; 

- (NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; 

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 
-(void)checkboxSelected:(id)sender; 
@end 

實施

#import "ViewController.h" 

#define sectionCount 1 
#define itemSection 0 

@interface ViewController() 
{ 
    NSArray *items; 
} 
@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    items = @[@"itemdd", @"item2",@"itemdd", @"item2",@"itemdd", @"item2",@"itemdd", @"item2",@"itemdd", @"item2",@"itemdd", @"item2",@"itemdd", @"item2",@"itemdd", @"item2",@"itemdd", @"item2",@"itemdd", @"item2"]; 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return sectionCount; 
} 

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    switch(section) 
    { 
     case itemSection: 
     { 
      return [items count]; 
     } 

     default: 
      return 0; 

    } 
} 

-(NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    switch (section) 
    { 
     case itemSection: 
      return @"Items"; 
     default: 
      return @"woot"; 
    } 
} 


-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:@"itemCell"]; 

    switch(indexPath.section) 
    { 
     case itemSection: 
      cell.textLabel.text = items[indexPath.row]; 
      break; 
     default: 
      [email protected]"Unknown"; 
    } 
NSInteger x,y; 

    x =cell.frame.origin.x +100; y = cell.frame.origin.y + 10; 
    UIButton *checkbox; 

    checkbox = [[UIButton alloc] initWithFrame:(CGRectMake(x,y,20,20))]; 

    [checkbox setBackgroundImage:[UIImage imageNamed:@"notSelectedButton.png"]forState:UIControlStateNormal]; 

    [checkbox setBackgroundImage:[UIImage imageNamed:@"checkedButton.png"]forState:UIControlStateSelected]; 
    [checkbox setBackgroundImage:[UIImage imageNamed:@"uncheckedButton.png"]forState:UIControlStateHighlighted]; 

    checkbox.adjustsImageWhenHighlighted = YES; 
    [checkbox addTarget:self action:@selector(checkboxSelected:) forControlEvents:UIControlEventTouchDown]; 
    [cell.contentView addSubview:checkbox]; 

    return cell; 
} 

-(void)checkboxSelected:(id)sender 
{ 
    bool selected = [(UIButton *)sender isSelected]; 
    if (selected) 
    { 
     [(UIButton *)sender setSelected:false]; 
    } 
    else 
    { 
     [(UIButton *)sender setSelected:true]; 
    } 


} 
@end 

回答

0

首先,看這個說法在你的代碼:

的方法-dequeueReusableCellWithIdentifier將拉動已經創建的表視圖單元格,或者如果沒有可用的可重用單元格,則生成新的表格視圖單元格。

現在查看本聲明:

checkbox = [[UIButton alloc] initWithFrame:(CGRectMake(x,y,20,20))]; 
… 
[cell.contentView addSubview:checkbox]; 

如果你的電池只是初始化,此代碼工作正常。但是,當您滾動表格時,您的代碼將開始拉動投入可重用隊列的舊錶格視圖單元格。那些舊的表格單元格已經包含UIButton。因此,每當您在舊電池上撥打-addSubview:時,都會添加重複的按鈕。

有很多方法可以解決這個問題。下面是你一個解決方案:

static NSInteger const checkboxTag = 123; 
checkbox = (UIButton *)[cell.contentView viewWithTag:checkboxTag]; 
if (!checkbox) { 
    checkbox = [[UIButton alloc] initWithFrame:(CGRectMake(x,y,20,20))]; 
    checkbox.tag = checkboxTag; 

    [checkbox setBackgroundImage:[UIImage imageNamed:@"notSelectedButton.png"]forState:UIControlStateNormal]; 
    [checkbox setBackgroundImage:[UIImage imageNamed:@"checkedButton.png"]forState:UIControlStateSelected]; 
    [checkbox setBackgroundImage:[UIImage imageNamed:@"uncheckedButton.png"]forState:UIControlStateHighlighted]; 
    checkbox.adjustsImageWhenHighlighted = YES; 
    [checkbox addTarget:self action:@selector(checkboxSelected:) forControlEvents:UIControlEventTouchDown]; 
    [cell.contentView addSubview:checkbox]; 
} 

編輯:

別的東西值得指出的。本聲明:

x =cell.frame.origin.x +100; y = cell.frame.origin.y + 10; 

通過參考cell.frame,你要創建一個UIButton相對於電池的位置在表視圖,而不是電池本身。設置x = 100; y = 10;來改變相對於單元格邊界的偏移量。

+0

謝謝!作品! 我在得到一個錯誤: 的UIButton *複選框= [cell.contentView viewWithTag:checkboxTag]; 「不兼容的指針類型用'UIView'類型的表達式初始化'UIButton *' – keyboardwarrior

+0

@ user2139652我編輯了我的答案,將'-viewWithTag:'的結果投射到'UIButton'。 – Matt