Как показать два объекта в одной ячейке (tableView)? - PullRequest
3 голосов
/ 22 января 2012

Я столкнулся с небольшой проблемой. Я создал UITableView, где пользователь может добавлять свои контакты из своей адресной книги. FirstName отображается в первом ряду, а lastName - во втором. Я знаю, в чем проблема, потому что сейчас я на самом деле говорю ему, как это сделать. Но как я могу сказать ему отображать оба имени в одной ячейке? Я сделал это с помощью следующих методов, но они не работают.

-(void)addObjectsFromArray:(NSArray *)otherArray
{
     NSMutableArray *myArray = [[NSMutableArray alloc] init];
     [myArray addObjectsFromArray:menuArray];
     NSLog(@"%@", myArray);
     [self.tableView reloadData];
}

Проблема в том, что я не могу отобразить объекты из myArray, потому что метод cellforRowAtIndex не получает значение. И с этим я получаю тот же результат (firstName first Row, lastName second Row):

NSArray *objects = [[NSArray alloc] initWithObjects:firstName, lastName, nil];
NSString *cellValue = [objects objectAtIndex:indexPath.row];
cell.textLabel.text = cellValue;
NSLog(@"%@", objects);

return cell;

1 Ответ

3 голосов
/ 22 января 2012

Ваш код не только отображает имя и фамилию в разных ячейках, он также не работает для строк с индексами больше единицы. Это потому, что ваш источник данных таблицы читает из совершенно нового массива, который вы создаете с помощью alloc / init в первой строке, а не из вашей модели . Ваш маленький массив содержит только два объекта, объясняющих две строки.

Вот что вам нужно сделать: во-первых, сделать массив пользователей доступным для источника данных вашей таблицы. Предположим, это называется userArray. Поместите пользовательские данные для каждого пользователя в этот массив. Предположим, что каждый пользователь хранится как объект типа MYUser, который отвечает на вызовы [user firstName] и [user lastName] с именем и фамилией пользователя.

Теперь поместите этот код в источник данных вашей таблицы:

MYUser *user = [userArray objectAtIndex:indexPath.row];
NSString *cellValue = [NSString stringWithFormat:@"%@ %@", [user firstName], [user lastName]];
cell.textLabel.text = cellValue;

РЕДАКТИРОВАТЬ : Если ваш menuArray хранит имя и фамилию в отдельных последовательных строковых объектах, вы все равно можете это сделать (хотя я рекомендую против этого, потому что это будет сбивать с толку людей, которые поддерживают ваша программа в будущем).

Во-первых, вам нужно изменить метод, который возвращает количество элементов в таблице, чтобы оно возвращало menuArray.count / 2 вместо menuArray.count. Затем вы можете изменить свой код следующим образом:

NSString firstName = [menuArray objectAtIndex:indexPath.row/2];
NSString lastName = [menuArray objectAtIndex:indexPath.row/2 + 1];
NSString *cellValue = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
cell.textLabel.text = cellValue;

EDIT2 : Вот как вы создаете класс, в котором хранятся имя и фамилия пользователя. Вы добавляете деталь @interface в MYUser.h, а деталь @implementation в MYUser.m файл. Затем вы импортируете MYUser.h в файлы .m, из которых вы ссылаетесь на класс MYUser, и используете initWithFirstName:andLastName: для инициализации новых экземпляров. В приведенном ниже примере предполагается, что вы используете ARC:

Файл MYUser.h:

#import <UIKit/UIKit.h>
@interface MYUser : NSObject
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
-(id)initWithFirstName:(NSString*)first andLastName:(NSString*)last;
@end

Файл MYUser.m:

@implementation MYUser
@synthesize firstName, lastName;
-(id)initWithFirstName:(NSString*)first andLastName:(NSString*)last {
    self = [super init];
    if (self) {
        self.firstName = first;
        self.lastName = last;
    }
    return self;
}
@end
...