2 NSArrays в одном UITableView с меткой в ​​качестве subView? - PullRequest
1 голос
/ 21 июня 2011

У меня проблема с моим текущим приложением.У него есть один UITableView в UIViewController.У меня есть один UIButton внизу (из UITableView).Это работает так:

if ([[NSUserDefaults standardUserDefaults] boolForKey:@"bla"]) {
[[NSUserDefaults standardUserDefaults] setBool:FALSE forKey:@"bla"];
[tableView reloadData]; 
} else {

[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"tasks2do"];
[tableView reloadData]; }

Это работало, когда у меня был метод cell.textLabel.text таким образом:

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

static NSString *ident = @"indet";

cell = [tableView dequeueReusableCellWithIdentifier:ident];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:ident] autorelease];

}

if (![[NSUserDefaults standardUserDefaults] boolForKey:@"bla"]) {

cell.textLabel.text = [firstArray objectAtIndex:indexPath.row]; 

} else {

cell.textLabel.text = [secondArray objectAtIndex:indexPath.row];

}                
return cell; }

Теперь я хочу использовать UILabel вместо cell.textLabel, потому что он мне нужен по некоторым причинам (например, установка рамки меток)

Для этого я использовал следующий код:

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

static NSString *ident = @"indet";

cell = [tableView dequeueReusableCellWithIdentifier:ident];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:ident] autorelease];
}
UILabel *thislabel = [[[UILabel alloc] initWithFrame:CGRectMake(10, 10, 250, 44)] autorelease];

if (![[NSUserDefaults standardUserDefaults] boolForKey:@"bla"]) {

    [thislabel setText:[firstArray objectAtIndex:indexPath.row]];

    } else {

    [thislabel setText:[secondArray objectAtIndex:indexPath.row]];

}   

[cell.contentView addSubview:thislabel];

return cell; }

Это работает нормально, пока я не нажму UIButton для переключения.Она переключается, в ячейке отображается новый текст, но за новым текстом остается старый текст, как вы можете видеть здесь:

http://d.pr/Rqx2

(firstArray содержит букву L, secondArrayсодержит букву J, она смешивает оба)

Есть ли у вас какие-либо идеи для решения этой проблемы, поскольку я попробовал некоторые вещи (например, используя 2 UILabel s для массивов и скрыть один)?Было бы здорово.:)

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

Если вам нужна дополнительная информация / кодпросто отправьте это, не должно быть проблемой.

1 Ответ

0 голосов
/ 21 июня 2011

Я рекомендую вам создать подкласс UITableViewCell, в котором вы настраиваете метку (установите фрейм и добавьте его как подпредставление в инициализаторе UITableViewCell). Добавьте свойство для установки текста в метке и напишите для свойства такой установщик:

- (void)setLabelText:(NSString *)newLabelText 
{
    if ([self.labelText isEqualToString:newLabelText]) return;
    [labelText autorelease];
    labelText = [newLabelText copy];

    self.label.text = labelText;
    [self.label setNeedsDisplay]; // or perhaps [self setNeedsDisplay];
}

Редактировать: кстати, проблема, с которой вы имеете дело, это кеширование. Вы создаете новую метку каждый раз, когда отображается ячейка, даже если у ячейки уже была метка. Это происходит потому, что вы инициализируете UILabel вне инициализатора UITableViewCell (который должен вызываться только один раз для каждой кэшированной ячейки, после чего ее можно извлечь из кэша, включая все его подпредставления).

...