Нужна помощь в понимании NSDictionary объектов - PullRequest
1 голос
/ 10 апреля 2011

Я пытаюсь обернуть голову вокруг класса NSDictionary, чтобы сделать мой TableView функциональным. Кто-нибудь может сломать и объяснить, что происходит в следующем коде для меня? веселит

if (!self.tableDataSource)
    {
        self.tableDataSource = [NSArray arrayWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"MenuData" ofType: @"plist"]];
        self.navigationItem.title = @"Menu";

    } 

NSDictionary *dictionary = [[[self.tableDataSource objectAtIndex: indexPath.section] objectForKey: @"Children"] objectAtIndex: indexPath.row];

Ответы [ 3 ]

1 голос
/ 10 апреля 2011

Я думаю, что сам код достаточно ясен, если вы просто распакуете все вызовы методов, чтобы увидеть подразумеваемую вложенность различных объектов. Комментарии:

// if the current object's tableDataSource property has not been defined yet
if (!self.tableDataSource) {
    // then define it.

    // Set it to be an NSArray initialized by reading ...
    self.tableDataSource = [NSArray arrayWithContentsOfFile: 
    // ... the plist file MenuData.plist found within the application's bundle
                      [[NSBundle mainBundle] pathForResource: @"MenuData" ofType: @"plist"]];

    // and also set the current object's property nagitationItem.title to "Menu"
    self.navigationItem.title = @"Menu";

} 

// Now create a dictionary

// Get this dictionary by ...

// going to the element numbered indexPath.section in the tableDataSource
NSDictionary *dictionary = [[[self.tableDataSource objectAtIndex: indexPath.section] 
                  // (assume that element is an NSDictionary)
                  // get that element's value stored witht the key "Children"
                  objectForKey: @"Children"] 
                 // (assume that retrieved value is an NSArray)
                 // then get the element numbered indexPath.row from that array
                 objectAtIndex: indexPath.row];
                             // expect that value to be an NSDictionary

Я думаю, что документы Apple на TableDataSource , вероятно, дадут вам более широкий контекст того, что делает этот код. В частности, вложение словаря, в массив, словарь, массив, что происходит в последней строке, может быть стандартным способом кодирования всей информации для строк, столбцов и т. Д., Для данные управляют UITableView.

1 голос
/ 14 апреля 2011

NSDictionary объекты хранят другие объекты, на которые ссылаются ключи. Ключ - это уникальная строка, используемая для ссылки на объект в словаре. Объект может быть любым объектом. NSMutableDictionary - это то же самое, но позволяет редактировать (добавлять / удалять / изменять) объекты для ключей после создания словаря.

Неправильно устанавливать NSDictionary (или любой класс, который не поддерживает протокол UITableViewDataSource) для свойства dataSource табличного представления. Чаще всего ваш контроллер представления является подклассом UITableViewController или это подкласс UIViewController, который поддерживает свойство UITableViewDelegate или UITableViewDataSource.

Это прямой ответ на ваш вопрос. Для более полного понимания вы должны вернуться и прочитать документы Apple, чтобы убедиться, что вы понимаете мой ответ. Руководство по программированию контроллера табличного представления покажет вам, как реализовать представления таблицы в контроллере представления. Для других вещей вам нужна информация об Objective-C и других объектах iOS.

1 голос
/ 10 апреля 2011

Вы должны установить DataSource и Delegate, чтобы они указывали на владельца tableView, а затем реализовать функции UITableViewDelegate для правильной установки содержимого таблицы.

Edit: если вы планируете реализовать представление таблицы сразделы, я советую вам использовать структуру данных MxN: NSArray из NSArray, так что вы сможете легко получить доступ к вашим данным ячейки с помощью:

cellData = [[datasource objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
...