Подробный вид, заполненный информацией о списке - PullRequest
1 голос
/ 03 февраля 2012

Я следовал учебному пособию по разработке для iOS, в частности, по UITableViews для детализации. У меня установлен собственный настраиваемый список рассылки, но, похоже, я не могу заставить DetailViewController заполнить его информацией о списках. Я мог бы действительно использовать некоторую помощь здесь, я немного над головой!

edit: вот некоторые детали ...

Приложение работает через заполненный списками RootViewController, который является UITableView. Когда в списке не осталось дочерних элементов, он переходит в подробный вид:

AppDelegate.m

NSDictionary *tempDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]];
self.data = tempDict;

RootViewController.m

- (void)viewDidLoad
    {
        [super viewDidLoad];
        if(CurrentLevel == 0) { // At the 'root' of the plist

            //Initilalize our table data source
            NSArray *tempArray = [[NSArray alloc] init];
            self.tableDataSource = tempArray;

            AppDelegate *AppDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
            self.tableDataSource = [AppDelegate.data objectForKey:@"Rows"];

            self.navigationItem.title = @"PedalTome";
        }
        else
            self.navigationItem.title = CurrentTitle;
    }

позже ...

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

        //Get the dictionary of the selected data source.
        NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];

        //Get the children of the present item.
        NSArray *Children = [dictionary objectForKey:@"Children"];

        if([Children count] == 0) {

            DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];
            [self.navigationController pushViewController:dvController animated:YES];

        }
        else {

            //Prepare to tableview.
            RootViewController *rvController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:[NSBundle mainBundle]];

            //Increment the Current View
            rvController.CurrentLevel += 1;

            //Set the title;
            rvController.CurrentTitle = [dictionary objectForKey:@"Title"];

            //Push the new table view on the stack
            [self.navigationController pushViewController:rvController animated:YES];

            rvController.tableDataSource = Children;

        }
    }

Мой DetailViewController.m пуст, за исключением заполнителя self.navigationController.title.

Если я правильно понимаю, мне нужно передать информацию от RootViewController до DetailViewController - местоположение и реализацию plist, уровень индекса (так он называется) в plist и строка внутри этот уровень индекса (под ключом Detail ).

На данный момент любой прогресс - это удивительный прогресс. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2012

Спецификатор табличного представления Может делать то, что вам нужно.

Заданное табличное представление - это табличное представление iOS, содержимое которого указано в файле plist.Его цель в значительной степени наглядна, но также предназначена для использования в живом продукте (полезно для страниц с кредитами).Может использоваться с iOS версии 4.2 и выше.

Копать их код, скорее всего, будет полезно.

0 голосов
/ 03 февраля 2012

Вы можете передать любую информацию, которая вам нужна, вашему DetailViewController, настроив синтезированное свойство в DetailViewController, а затем передав ему свои данные внутри блока if.

Например, в вашем DetailViewController.h вы должны иметь следующее (без ARC):

@property (retain, nonatomic) NSDictionary *myAwesomeDictionary;

Или, с включенной ARC:

@property (strong, nonatomic) NSDictionary *myAwesomeDictionary;

Тогда в DetailViewController.m вы получите следующее:

@synthesize myAwesomeDictionary;

Тогда вы измените свой блок кода следующим образом:

if([Children count] == 0) {
    DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];

    [dvController setMyAwesomeDictionary:dictionary];

    [self.navigationController pushViewController:dvController animated:YES];
}

Предполагается, что NSDictionary с именем dictionary, который вы создали несколькими строками выше, - это данные, которые вы хотели бы показать в своем DetailViewController.

Затем в вашем методе DetailViewController viewDidLoad: вы можете получить доступ к этому словарю с помощью self.myAwesomeDictionary и делать с ним все, что вам нужно.

Отказ от ответственности:

Кажется, что две вещи противоречат стандартам стиля кода Apple в вашем коде:

  1. Ваш AppDelegate хранит вашу модель (ваш список). - Apple говорит, что вы не должны собирать свои AppDelegate глобальными данными / логикой. В общем, пишите только код, который относится конкретно к классу в этом конкретном классе.
  2. Вы не анализируете свой список в пользовательских объектах. - Это затрудняет кодирование, потому что вам постоянно приходится выяснять, что представляют собой ваши универсальные объекты Array и Dictionary, и делать ваш код полностью нечитаемым для других людей.
  3. Некоторые имена переменных вашего экземпляра пишутся с большой буквы. Например, NSArray *Children должно быть NSArray *children и CurrentLevel должно быть currentLevel. Только имена классов имеют первую букву заглавной.

Проверьте http://jlawr3nc3.github.com - в частности, мой пример кода CompanyRecords для получения информации о том, как создать класс, и FunWithArrays, как проанализировать plist в пользовательских объектах. Затем MusicLibraryiOS изучает, как взять список, разобрать его в пользовательские объекты, а затем отобразить его в UITableView вместе с подробным представлением.

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