最后一个单元格在UITableView

时间:2015-11-02 07:24:58

标签: ios swift uitableview

我有7个自定义单元格的tableview。细胞足够大,任何时候只有5个细胞适合屏幕。根据内容,不同的单元格是用户可配置的,这就是我注意到有一些奇怪的事情发生的原因。当表首次加载,并向下滚动以第一次查看所有单元格时,单元格内容都是正确的。然而,奇怪的是,一旦你上下滚动几次使得顶部细胞和底部细胞从屏幕上消失几次,底部细胞的内容将获得第一个细胞的特性。

请注意,willDisplayCell中根本没有代码,因此没有理由因为滚动而改变内容。此外,所有滚动都没有在任何单元格中注册触摸。我有一种强烈的感觉,这是某种出局问题。无论滚动量多少,我需要做些什么来确保单元格的内容保持稳定?

这是TVC代码:

import Foundation
import UIKit

class adventureTVC: UITableViewController {

    var focusArray: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        // General Setup
        self.title = selectedGenre
        self.tableView.rowHeight = 98.0
        self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        self.view.backgroundColor = UIColor(red: 0.8, green: 0.8, blue: 0.8, alpha: 1.0)
        self.tableView.contentInset.bottom = 49

        // Registering the custom cell
        let nib = UINib(nibName: "StarsAcrossCell", bundle: nil)
        tableView.registerNib(nib, forCellReuseIdentifier: "starsCell")

        // Data used by this TVC.  This should be the Genre for which ever cell was touched to get here
        focusArray = bookage.focusArray()

    }

    override func viewWillAppear(animated: Bool) {
        tableView.reloadData()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
        return focusArray.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell: StarsAcrossCell = self.tableView.dequeueReusableCellWithIdentifier("starsCell") as! StarsAcrossCell
        cell.selectionStyle = .None

        cell.groupTypeLabel.text = focusArray[indexPath.row]
        cell.cellBorder.backgroundColor = getCellColor(indexPath.row)

        let statusArray = bookage.getReadStatusArrayForFocus(selectedCategory, genre: selectedGenre, focus: focusArray[indexPath.row])
        setStarImages(statusArray, cell: cell)

        return cell
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    }

}

2 个答案:

答案 0 :(得分:2)

似乎是细胞重用问题。您需要在自定义单元类中实现-prepareForReuse方法,并将所有单元属性设置为默认值。

$scope.deleteSong = function($songName, $artist, $link) {
// Posting data to php file
$http({
    method  : 'POST',
    url     : 'ajax/deleteSong.php',
    data    : {'song':$songName},//Changed Line Here 
    headers : {'Content-Type': 'application/x-www-form-urlencoded'}
})
    .success(function(data) {

        if (data.errors) {
            // Showing errors.
            $scope.errorSong= data.errors.song;
            $scope.errorArtist= data.errors.artist;
            $scope.errorLink= data.errors.link;
        } else {
            $scope.message = data.message;
        }
    });
$scope.user = null
  

如果UITableViewCell对象是可重用的 - 也就是说,它具有重用性   identifier - 在返回对象之前调用此方法   来自UITableView方法dequeueReusableCellWithIdentifier:。对于   性能原因,你应该只重置那个单元格的属性   与内容无关,例如,alpha,编辑和选择   州。 tableView中的表视图委托:cellForRowAtIndexPath:   重复使用单元格时应始终重置所有内容。如果是细胞   对象没有关联的重用标识符,此方法是   不叫。如果重写此方法,则必须确保调用   超类实现。

请参阅此处了解更多信息,https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewCell_Class/#//apple_ref/occ/instm/UITableViewCell/prepareForReuse

答案 1 :(得分:0)

首先创建customtableviewcell(如果你还没有创建它)

RatingViewCell.h

@interface RatingViewCell : UITableViewCell<RatingViewDelegate>

@property (strong, nonatomic) IBOutlet UILabel *lblTitle;
@property (strong, nonatomic) RatingView *ratingView;

@end

RatingViewCell.m

@implementation RatingViewCell

@synthesize lblTitle,ratingView2;

- (void)awakeFromNib
 {
     // Initialization code
     ratingView2 = [[RatingView alloc] initWithFrame:CGRectMake(-10,22,130,15)
                              selectedImageName:@"RatingStartBig"
                                unSelectedImage:@"RatingStartBigBlank"
                                minValue:0
                                 maxValue:5
                                  intervalValue:0.5
                                     stepByStep:NO];
ratingView2.userInteractionEnabled = NO;
ratingView2.delegate = self;

[self.contentView addSubview:ratingView2];


}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];

// Configure the view for the selected state
 }

然后在tableview的CellforRow方法中使用此customCell作为

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CellID";
        RatingViewCell *cell = (RatingViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if(cell == nil){
            cell = [[RatingViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
        }

        cell.lblTitle.text = @"Title"; // use array to pass values dynamically
        cell.ratingView2.value = 2.0; // use array to pass values dynamically

        return cell;
}