UITableViewCell получает изображение по умолчанию, когда я прокручиваю вниз и вверх UITableView - PullRequest
0 голосов
/ 29 декабря 2011

Когда я проверял ячейку, связанное изображение изменяется, но когда я прокручивал вниз и вверх, ячейка получала изображение по умолчанию, это мой код:

- (UITableViewCell *)tableView:(UITableView *)tableView

         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
    NSArray *listData =[self->tableContents objectForKey:
                        [self->sortedKeys objectAtIndex:[indexPath section]]];
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: SimpleTableIdentifier];
    if(cell == nil) {
        cell = [[UITableViewCell alloc]
                initWithStyle:UITableViewCellStyleDefault
                reuseIdentifier:SimpleTableIdentifier];
    }
    NSUInteger row = [indexPath row];
    cell.textLabel.text = [listData objectAtIndex:row];
    UIImageView *unchecked = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"unchecked.png"]];
UIImageView *checked = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checked.png"]];

BOOL bChecked = NO;//By default, it's unchecked, so NO

/// Assign cell according to `bChecked`
cell.accessoryView = (bChecked ? checked : unchecked); 
return cell;

}

EDIT:

Я отредактировал свой код, чтобы он выглядел так, как указано выше, но я все еще получаю проблему, изображение по умолчанию возвращается, когда я прокручиваю свое представление таблицы.

РЕДАКТИРОВАТЬ 2: @Openside: так, в соответствии с вашим подходом, мой фрагмент должен выглядеть следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView

         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
    NSArray *listData =[self->tableContents objectForKey:
                        [self->sortedKeys objectAtIndex:[indexPath section]]];

    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: SimpleTableIdentifier];
    if(cell == nil) {
        cell = [[UITableViewCell alloc]
                initWithStyle:UITableViewCellStyleDefault
                reuseIdentifier:SimpleTableIdentifier];
    }
    NSUInteger row = [indexPath row];
    textClass *myText = (textClass*)[listData objectAtIndex:row];
    cell.textLabel.text = myText.text;
    UIImageView *unchecked = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"unchecked.png"]];
    UIImageView *checked = [[UIImageView alloc] initWithImage:[UIImage  imageNamed:@"checked.png"]];



    cell.accessoryView = (myText.isChecked ? checked : unchecked); 
    return cell;
}


- (void)tableView:(UITableView *)tableView

didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    textClass *myText=[[textClass alloc]init];
    myText.isChecked=YES;
}

Я получил это исключение:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString text]: unrecognized selector sent to instance 0x673bc'

Строка, указывающая на проблему исключительной ситуации, такова (в cellForRowAtIndexPath методе делегата):

cell.textLabel.text = myText.text;

Я добавил класс textClass, хотя я не настолько убежден, я думаю, что могу использовать свойство в классе держателя моего UITableView.

Ответы [ 3 ]

2 голосов
/ 29 декабря 2011

Как сказал Openside, при прокрутке ячейка будет выходить из очереди.Итак, нам нужно назначить изображение в соответствии с новым состоянием.

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

    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
    UITableViewCell *cell = ...; ///< reuse a created cell.
    if(cell == nil) {
        cell = ...; ///< create a new cell
    }

    BOOL bChecked = ...///< Decide the cell checked or not.

    /// Assign cell according to `bChecked`
    cell.accessoryView = (bChecked ? imgChecked : imgNonChecked); 
    return cell;

}

Edit:
Что касается меня, я решу проверить статус методом indexPathForSelectedRow tableView.Я предполагаю, что ваш вид таблицы не множественный выбор.Он выбирает только одну строку за раз.

Итак, я выбираю проверенный статус следующим образом.Потому что tableView содержит информацию о том, какой indexPath выбран.

NSIndexPath *selIndexPath = [tableView indexPathForSelectedRow];
BOOL bChecked = [indexPath isEqual:selIndexPath];
1 голос
/ 29 декабря 2011

Проблема в том, что ячейка будет обновлена ​​(или повторно использована, следовательно, dequeueReusableCellWithIdentifier), когда вы прокрутите ее вне поля зрения и затем вернетесь в поле зрения.Вы должны иметь флаг на вашем исходном объекте, чтобы сказать, проверен ли он или нет, а затем добавить оператор if, чтобы определить, используется ли изображение checked.png или unchecked.png.

Однако, глядя на ваш код, исходный объект - это просто текст, возможно, стоит создать подклассный NSObject с двумя свойствами

text и проверить

Тогда ваш код cellForRowAtIndexPathопределить, какое изображение показывать.

Надеюсь, это поможет.

- (UITableViewCell *)tableView:(UITableView *)tableView

     cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: SimpleTableIdentifier];
if(cell == nil) {
    cell = [[UITableViewCell alloc]
            initWithStyle:UITableViewCellStyleDefault
            reuseIdentifier:SimpleTableIdentifier];
}
NSUInteger row = [indexPath row];
textClass *myText = (textClass*)[listData objectAtIndex:row];
cell.textLabel.text = myText.text;
UIImageView *unchecked = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"unchecked.png"]];
UIImageView *checked = [[UIImageView alloc] initWithImage:[UIImage  imageNamed:@"checked.png"]];



/// Assign cell according to `bChecked`
cell.accessoryView = (myText.isChecked ? checked : unchecked); 
return cell;

}

@interface textClass : NSObject {

@private
    NSString *_text;
    BOOL _isChecked;
}

@property (nonatomic, retain) NSString *text;
@property (nonatomic, assign) BOOL isChecked;

@end

@implementation textClass

@synthesize text = _text;
@synthesize isChecked = _isChecked;

@end

Хорошо, поэтому здесь я создал класс с именем textClass, он имеет два свойства text и isChecked.Когда вы загружаете ваше представление, заполните NSMutableArray (listData) этими объектами, используя текст, который вы ранее использовали.Когда ваша ячейка будет проверена, установите для свойства isChecked значение YES, когда ячейка будет повторно использована, это свойство сохранило свое состояние вне метода делегата и должно отображаться правильно.

0 голосов
/ 30 декабря 2011

Введите полный код в скобках:

- (UITableViewCell *)tableView:(UITableView *)tableView

         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
    NSArray *listData =[self->tableContents objectForKey:
                        [self->sortedKeys objectAtIndex:[indexPath section]]];

    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: SimpleTableIdentifier];
    if(cell == nil) {
        cell = [[UITableViewCell alloc]
                initWithStyle:UITableViewCellStyleDefault
                reuseIdentifier:SimpleTableIdentifier];

    NSUInteger row = [indexPath row];
    textClass *myText = (textClass*)[listData objectAtIndex:row];
    cell.textLabel.text = myText.text;
    UIImageView *unchecked = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"unchecked.png"]];
    UIImageView *checked = [[UIImageView alloc] initWithImage:[UIImage  imageNamed:@"checked.png"]];



    cell.accessoryView = (myText.isChecked ? checked : unchecked); 
}
    return cell;
}  

Это определенно должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...