Я решил эту проблему некоторое время назад с помощью хороших людей здесь и на форумах Mac Dev.Я думал, что вернусь и поделюсь тем, что я узнал, для всех, кто не знаком с iphone Dev (как я) и борется с этой проблемой.
ОБРАТИТЕ ВНИМАНИЕ: Нижеследующее написано в меру моего понимания того, что я узнал, пытаясь решить эту проблему, поэтому в моем описании может быть несколько технических ошибок.Если вы заметите что-нибудь, я был бы рад, если бы вы указали на них.Я занимаюсь разработкой для iphone, потому что хочу научиться программировать, поэтому исправления приветствуются!
Во-первых, My Plist по-прежнему выглядит так же.Это массив словарей.Это действительно гораздо более простой способ сделать то, что я хотел сделать, чем использовать словарь массивов, с которого я изначально и начал.Причина, по которой код в моем исходном сообщении выглядит так плохо, заключается в том, что он основан на моем понимании того, как заполнять таблицу с помощью словаря массивов, что является неуклюжим.
С источником данных разобрались, давайте перейдем к моему .h файлу.это довольно просто и выглядит так:
@interface MyTableViewController : UITableViewController
{
IBOutlet UITableView *myTableView;
MyDetailViewController *myDetailViewController;
NSArray *tableDataSource;
}
@property (nonatomic, retain) myDetailViewController *myDetailViewController;
@property (nonatomic, retain) NSArray *tableDataSource;
@end
Все довольно самоочевидно.У меня есть выход для просмотра таблицы и таблицы детализации.У меня также есть массив, в который я буду читать мой .plist в таблицу.
Переход к моему файлу .m, который выглядит следующим образом:
@implementation TableViewController
@synthesize myDetailViewController;
@synthesize tableDataSource;
- (void)viewDidLoad {
[super viewDidLoad];
self.title = NSLocalizedString(@"Tester", @"Browse by name");
// Path to the plist (in the application bundle)
NSString *path = [[NSBundle mainBundle] pathForResource:@"Testers" ofType:@"plist"];
// Retrieve the plist's root element array
NSArray *array = [[NSArray alloc] initWithContentsOfFile:path];
// Assign the plist array to my instance variable
self.tableDataSource = array;
[array release];
}
ПодшипникИсходный вопрос, я думаю, важная часть, на которой нужно сконцентрироваться - это метод viewDidLoad.По сути, после супер я назначаю имя в верхней части табличного представления.Затем я создаю строку под названием «путь», которая составлена из моего .plist под названием «Тестеры».Я создаю массив под названием «массив» и инициализирую его содержимым строки, которую я только что создал, под названием «путь».Наконец, я назначаю свой массив .plist моей переменной экземпляра NSArray 'tableDataSource'.Это намного проще, чем моя первоначальная попытка.Во-первых, мне больше не нужна отдельная модель классов.
Следующая ключевая вещь - это мой cellForRowAtIndexPathMethod, который теперь выглядит следующим образом:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell.
NSDictionary *sectionDictionary = [tableDataSource objectAtIndex:indexPath.section];
NSArray *sectionRowArray = [sectionDictionary objectForKey:@"rowData"];
NSDictionary *rowDictionary = [sectionRowArray objectAtIndex:indexPath.row];
cell.textLabel.text = [rowDictionary objectForKey:@"Title"];
return cell;
}
Это почтиТо же, что и раньше, за исключением того, что средства, с помощью которых настроена ячейка, изменились, чтобы приспособиться к моему новому способу чтения данных из .plist.Так что я больше не имею в виду модель Dict."rowData" и "Title" - это ключи в моем списке (см. очень верхнюю часть страницы).«rowData» - это ключ для каждого раздела, а «Title» - это текст, который виден в ячейке во время выполнения скрипта.
Другой ключевой бит информации - это метод didSelectRowAtIndexPath, который определяет, что будет передано.в подробный вид, когда ячейка выбрана.Это выглядит так:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Get the dictionary of the selected data source.
NSDictionary *dictionary = [[[self.tableDataSource objectAtIndex:indexPath.section]objectForKey:@"rowData"] objectAtIndex:indexPath.row];
MyDetailViewController *controller = [[MYDetailViewController alloc] initWithNibName:@"MyDetailView" bundle:[NSBundle mainBundle]];
controller.title = [dictionary objectForKey:@"Title"];
controller.dText = [dictionary objectForKey:@"dText"];
[self.navigationController pushViewController:controller animated:YES];
[controller release];
}
Я начинаю с получения словаря для источника данных таблицы, который был назначен моей переменной экземпляра tableDataSource в моем методе viewDidLoad.Затем я сообщаю своему контроллеру подробностей вида, что он есть в основном пакете, и говорю ему, что при нажатии подробного представления он должен поместить все, что находится в позиции клавиши «Заголовок», в качестве заголовка этого конкретного экземпляра подробного представления и что ондолжен заполнить TextView в этом кончике текстом в .plist с ключом "dText".
Ну, вот и все.У меня это работало нормально, хотя я не могу поклясться, что это правильный способ сделать это.Благодаря людям, которые помогли мне получить его, в конце концов, я поднялся на еще один холм!
Надеюсь, это пригодится кому-то еще.