Отсортировано UITableViewCell по plist (не по имени textLabel)

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

ОБНОВЛЕНИЕ: Добавлена ​​структура данных:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>Rows</key>
        <array>
            <dict>
                <key>Subtree</key>
                <array>
                    <string>Address</string>
                    <string>Tuesday</string>
                    <string>Information</string>
                    <integer>36</integer>
                    <integer>-118</integer>
                    <string>Place LA</string>
                    <string>California</string>
                </array>
                <key>Title</key>
                <string>California</string>
            </dict>
            <dict>
                <key>Subtree</key>
                <array>
                    <string>Address</string>
                    <string>Sunday</string>
                    <string>Information</string>
                    <integer>40</integer>
                    <integer>-72</integer>
                    <string>NY Place</string>
                    <string>New York</string>
                </array>
                <key>Title</key>
                <string>New York</string>
            </dict>
            <dict>
                <key>Subtree</key>
                <array>
                    <string>Address</string>
                    <string>Sunday</string>
                    <string>Information</string>
                    <integer>30</integer>
                    <integer>-97</integer>
                    <string>Austin Place</string>
                    <string>Texas</string>
                </array>
                <key>Title</key>
                <string>Texas</string>
            </dict>
            <dict>
                <key>Subtree</key>
                <array>
                    <string>Address</string>
                    <string>Wednesday</string>
                    <string>Information</string>
                    <integer>30</integer>
                    <integer>-97</integer>
                    <string>Cleveland Place</string>
                    <string>Ohio</string>
                </array>
                <key>Title</key>
                <string>Ohio</string>
            </dict>
        </array>
    </dict>
</array>
</plist>


- (void)viewDidLoad {
     [super viewDidLoad];
     if (!self.tableData)
     {
         [self sortedArray];
         self.title = @"Title"
     }
}


-(NSArray *)sortedArray
{
    NSString *path = [[NSBundle 
                       mainBundle]pathForResource:@"Data3" ofType:@"plist"];
    tableData = [NSArray arrayWithContentsOfFile:path];
    NSArray *rows = [[tableData objectAtIndex:0]objectForKey:@"Rows"];
    NSArray *rows2 = [[rows objectAtIndex:0]objectForKey:@"Subtree"];
    NSString *states = [NSString stringWithFormat:@"%@",[rows2 objectAtIndex:6]];
    NSString *days = [NSString stringWithFormat:@"%@",[rows2 objectAtIndex:1]];
    NSSortDescriptor *stateDescriptor = [[NSSortDescriptor alloc]initWithKey:states ascending:YES];
    NSSortDescriptor *dayDescriptor = [[NSSortDescriptor alloc]initWithKey:days ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:stateDescriptor, dayDescriptor, nil];
    NSArray *finalArray = [tableData sortedArrayUsingDescriptors:sortDescriptors];
    return finalArray;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.textLabel.font = [UIFont fontWithName:@"MarkerFelt-Thin" size:24];
    cell.textLabel.text = [[[[tableData objectAtIndex: indexPath.section] objectForKey: @"Rows"] objectAtIndex: indexPath.row] objectForKey: @"Title"];
    cell.detailTextLabel.font = [UIFont fontWithName:@"MarkerFelt-Thin" size:14];
    cell.detailTextLabel.text = [[[[[tableData objectAtIndex: indexPath.section] objectForKey: @"Rows"] objectAtIndex: indexPath.row] objectForKey: @"Subtree"]objectAtIndex:0];
    return cell;
}

person Eric    schedule 05.05.2011    source источник
comment
У меня есть 2 предложения. 1 - разбить ваши глубоко вложенные операторы на более мелкие, легко отлаживаемые операторы. 5 квадратных скобок подряд — это красный флаг. 2 - не сортировать массив внутри метода cellForRowAtIndexPath:, если только tableData полностью не меняется с каждой строкой.   -  person Rayfleck    schedule 06.05.2011
comment
@Mike Я добавил код с отдельным методом для их сортировки. Пожалуйста, смотрите мой вопрос выше, где я могу использовать его для сортировки?   -  person Eric    schedule 06.05.2011
comment
Вам нужно повторно сортировать одни и те же данные по-разному для каждой строки, или это один набор данных, который сортируется один раз, а разные части отображаются в разных строках? Если это последнее, сортируйте в viewDidLoad. Если первое, мне нужно лучше понять вашу структуру данных.   -  person Rayfleck    schedule 06.05.2011
comment
@Mike, я сделал еще одно обновление, и это последнее. Он просто сортируется один раз за просмотр.   -  person Eric    schedule 06.05.2011
comment
@Eric - я думаю, вы загружаете свои данные во что-то, называемое массивом, но затем вы создаете свой finalArray, сортируя tableData, а не массив. Кстати, массив не очень описательное имя - стоит потратить дополнительные 5 секунд, чтобы правильно назвать вещи. Поверьте мне в этом :)   -  person Rayfleck    schedule 06.05.2011
comment
@Mike Я сделал полное обновление, чтобы вы могли все видеть, я перестану вас беспокоить, но любая помощь очень ценится. (не беспокойтесь об именах или утечке памяти, я позаботился об этом).   -  person Eric    schedule 06.05.2011


Ответы (1)


Ввиду того, что загрузился, может быть

self.tableDate = [self sortedArray];

В вашем методе sortedArray вы сортируете данные и возвращаете их, но никогда не присваиваете отсортированный массив чему-либо.

Однако вы присваиваете несортированные данные tableData в методе sortedArray, поэтому вы получаете несортированные данные. Я бы убрал это задание, оно сбивает с толку.

person Terry Wilcox    schedule 06.05.2011
comment
это не изменило его. Можете ли вы подумать, почему мои журналы показывают это, но это не сработает? ((Калифорния, по возрастанию, сравните:)) - person Eric; 06.05.2011
comment
Вам нужно посмотреть на свой отсортированный массив, чтобы увидеть, действительно ли он отсортирован так, как вы хотите. Я не знаю, как выглядят ваши данные, поэтому я не знаю, правильны ли ваши дескрипторы сортировки. - person Terry Wilcox; 06.05.2011
comment
Я добавил структуру данных. Я хотел бы заказать каждое отображаемое поддерево информации по строке № 6 (состояние). Так что в этом примере это будет 1,2,4,3 (CA, NY, OH, TX). - person Eric; 06.05.2011
comment
Дескрипторы сортировки, которые вы передаете, похоже, говорят ему сортировать по ключу California, которого не существует. Вы передаете значение ключа, а не имя ключа. Ознакомьтесь с stackoverflow. com/questions/4767219/ для решения аналогичной проблемы. - person Terry Wilcox; 06.05.2011
comment
Я получаю этот NSLog по фактической сортировке sortDescriptor (((\n Калифорния,\n\Нью-Йорк\,\n Техас,\n Огайо\n), по возрастанию, сравните :)) - person Eric; 07.05.2011