Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование iOS/iPhone
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
opi
7 / 7 / 2
Регистрация: 09.11.2010
Сообщений: 69
1

Сортировка в UITableView

14.03.2013, 17:49. Просмотров 1591. Ответов 6
Метки нет (Все метки)

Добрый день.
Во время разработки столкнулся с необходимостью сортировки, а так же связанным с ней багом. Обо всем по порядку.
1. Хотелось бы узнать, как можно сортировать ячейки относительно своих условий. Например, по дате, которая содержится в каждой ячейке, и числу, которое также размещается на ней. С учетом того, что все данные берутся из Core Data.
2. И баг связанный с той же Core Data и сортировкой. Суть в чем. В приложении чтобы посмотреть более детальную информацию, нужно тапнуть на соответствующую ячейку и перейти на другой Вью. Внутри этого вью имеется возможность редактировать часть данных, но это не суть важно (хотя не факт). Когда возвращаешь на Вью с таблицей, ячейка из свой позиции может переместиться в конец списка или куда то в центр. Почему так? Причем иногда это происходит, а иногда нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2013, 17:49
Ответы с готовыми решениями:

Несуществующий UITableView
Добрый вечер. Столкнулся с такой проблемой: создал простое приложение с...

Работа с жестами в UITableView
Разрабатываем приложение, столкнулись с проблемой жестов в uitableView. в...

Индексация ячеек в UITableView
Здравствуйте, скажите пожалуйста как решить проблему: у меня в UITableView есть...

UISearchBar & UITableView
Доброго времени суток вопрос. Переделываю приложение под iOS 7 добавил поиск по...

UITableView запутался с вьюхой
Коллеги что-то я запутался. Есть storyboard, в нем UIViewController с...

6
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
14.03.2013, 18:13 2
1. Ячейки сортируются в датасорсе.
2. Причин масса может быть. Первая - устройство датасорса. В любом случае должен спасти метод - (void)scrollToRowAtIndexPathNSIndexPath *)indexPath atScrollPositionUITableViewScrollPosition)scrollPosition animatedBOOL)animated
0
opi
7 / 7 / 2
Регистрация: 09.11.2010
Сообщений: 69
14.03.2013, 19:02  [ТС] 3
А не подскажете как вводить параметры на сортировку в датасорсе?
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
14.03.2013, 20:29 4
Код датасорса в студию. Будем думать. А то вопрос из серии "Почему у соседа машина не едет?"
0
opi
7 / 7 / 2
Регистрация: 09.11.2010
Сообщений: 69
15.03.2013, 01:49  [ТС] 5
Ну это понятно Собственно вот код ниже, но он не приведен в порядок Именно, кстати, здесь и скачут ячейки, после апдейта Core Data. Как вы видите, я нигде не использовал метод сортировки. В просторах интернета находил только сортировку по алфавиту.

TaskTVC.m
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
//
//  TasksTVC.m
//  TaskBoard
//
//  Created by Владислав on 02.03.13.
//  Copyright (c) 2013 Vladislav Kovalyov. All rights reserved.
//
 
#import "TasksTVC.h"
#import "DetailTaskVC.h"
 
 
@interface TasksTVC ()
 
@end
 
@implementation TasksTVC {
    NSArray *searchResults;
}
 
@synthesize tasks;
@synthesize progressValue;
 
- (NSManagedObjectContext *)managedObjectContext {
    NSManagedObjectContext *context = nil;
    id delegate = [[UIApplication sharedApplication] delegate];
    if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }
    return context;
}
 
- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
    }
    return self;
}
 
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.parentViewController.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"common_bg.png"]];
    self.tableView.backgroundColor = [UIColor clearColor];
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    
    
    /*UIEdgeInsets inset = UIEdgeInsetsMake(5, 0, 0, 0);
    self.tableView.contentInset = inset;*/
}
 
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Tasks"];
    self.tasks = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
    
    [self.tableView reloadData];
}
 
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}
 
#pragma mark - Table view data source
 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.searchDisplayController.searchResultsTableView){
        return [searchResults count];
    }else {
        return self.tasks.count;
    }
}
 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"TaskCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    
    //UIImage *background = [slef ce];
    
    NSManagedObject *task = [self.tasks objectAtIndex:indexPath.row];
    
    NSNumber *nProgress = [task valueForKey:@"progress"];
    progressValue = [nProgress integerValue];
    
    UILabel *taskNameLabel = (UILabel *)[cell viewWithTag:100];
    [taskNameLabel setText:[task valueForKey:@"taskName"]];
    
    UILabel *taskProgressLabel = (UILabel *)[cell viewWithTag:101];
    [taskProgressLabel setText:[NSString stringWithFormat:@"%@%%",[task valueForKey:@"progress"]]];
    
    YLProgressBar *progrssBar = (YLProgressBar *)[cell viewWithTag:102];
    progrssBar.progressTintColor = [UIColor magentaColor];
    [progrssBar setProgress:(float)progressValue/100];
    
    UILabel *stepsCount = (UILabel *)[cell viewWithTag:103];
    [stepsCount setText:[NSString stringWithFormat:@"%@ of %@",[task valueForKey:@"subTaskCurrent"],[task valueForKey:@"subTaskCount"]]];
    
    UILabel *taskDescription = (UILabel*)[cell viewWithTag:104];
    [taskDescription setText:[task valueForKey:@"taskDescription"]];
    
    // Assign our own background image for the cell
    UIImage *background = [UIImage imageNamed:@"cellbackground.png"];
    
    UIImageView *cellBackgroundView = [[UIImageView alloc] initWithImage:background];
    cellBackgroundView.image = background;
    cell.backgroundView = cellBackgroundView;
    
    return cell;
}
 
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}
 
#pragma mark - Segue pass data section
 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showTaskDetail"]) {
        NSManagedObject *selectedTask = [self.tasks objectAtIndex:[[self.tableView indexPathForSelectedRow] row]];
        DetailTaskVC *destViewController = segue.destinationViewController;
        destViewController.selectedTaskInfo = selectedTask;
    }
}
 
#pragma mark - Delete section
 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSManagedObjectContext *context = [self managedObjectContext];
    
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete object from database
        [context deleteObject:[self.tasks objectAtIndex:indexPath.row]];
        
        NSError *error = nil;
        if (![context save:&error]) {
            NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]);
            return;
        }
        
        // Remove device from table view
        [self.tasks removeObjectAtIndex:indexPath.row];
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}
 
#pragma mark - Table view delegate section
 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
 
}
 
@end
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
15.03.2013, 08:27 6
строчки 58-59 замените на:
Objective-C
1
2
3
4
5
 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Tasks"];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"taskName" ascending:YES];//Или какойнибудь date... По какому ключу сортировать собственно
fetchRequest.sortDescriptors = @[sortDescriptor];
self.tasks = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
И перевыборку лучше все же в -viewWillAppear.
А еще лучше - после изменения сущности - перезагружать и обновлять Только эту сущность.

Вам не нужно самому все сортировать, раз вы используете CoreData. Все уже сделано за вас в SQL и в обертке из CoreData.
1
opi
7 / 7 / 2
Регистрация: 09.11.2010
Сообщений: 69
21.03.2013, 13:57  [ТС] 7
Столкнулся с проблемой, когда нужно сортировать данные не по ключу, а по динамическим данным, которые вычисляются в процессе заполнения таблицы. Собственно написан код ниже. Можно ли как то сортировать таблицу по тексту в ней? В моем случае это detailTextLabel.

В коде я пытаюсь рассчитать данные priorityIndex в момент заполнения таблицы. Далее заполняю ячейку в Core Data этими расчетами и из нее выдираю данные и вывожу их в detailTextLabel. Знаю, что как то через чур замудрено, но в связи с отсутствием опыта на Obj-C ничего лучше придумать не смог. Во всяком случае оно работает. Но, когда я пытаюсь сортировать таким образом саму Core Data по ключу priorityIndex, то ничего не сортирует:

Objective-C
1
2
NSSortDescriptor *sortDescriptorPriorityIndex = [[NSSortDescriptor alloc]initWithKey:@"priorityIndex" ascending:YES];
    fetchRequest.sortDescriptors = @[sortDescriptorPriorityIndex];
Собственно я вот думаю, а можно ли как то сортировать саму таблицу по имеющимся в ней данным? При этом не добавляя ничего в саму Core Data.

PriorityTVC
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//
//  PriorityTVC.m
//  TaskBoard
//
//  Created by Владислав on 13.03.13.
//  Copyright (c) 2013 Vladislav Kovalyov. All rights reserved.
//
 
#import "PriorityTVC.h"
 
@interface PriorityTVC ()
 
@end
 
@implementation PriorityTVC
 
@synthesize tasks;
@synthesize taskIndex, priorityIndex, dateIndexValue, taskCountIndexValue;
@synthesize currendDate, completionDate;
 
- (NSManagedObjectContext *)managedObjectContext {
    NSManagedObjectContext *context = nil;
    id delegate = [[UIApplication sharedApplication] delegate];
    if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }
    return context;
}
 
- (void)viewDidLoad
{
    [super viewDidLoad];
 
    self.parentViewController.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"common_bg.png"]];
    self.tableView.backgroundColor = [UIColor clearColor];
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
}
 
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
 
}
 
-(void)viewWillAppear:(BOOL)animated{
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Tasks"];
    
   /* NSSortDescriptor *sortDescriptorProgress = [[NSSortDescriptor alloc] initWithKey:@"porgress" ascending:YES];
    NSSortDescriptor *sortDescriptorPriorityIndex = [[NSSortDescriptor alloc]initWithKey:@"priorityIndex" ascending:YES];
    fetchRequest.sortDescriptors = @[sortDescriptorPriorityIndex,sortDescriptorProgress];*/
    self.tasks = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
    
    [self.tableView reloadData];
}
 
 
 
#pragma mark - Table view data source
 
 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}
 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.tasks.count;
}
 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"TaskCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    
    NSManagedObject *task = [self.tasks objectAtIndex:indexPath.row];
    
    taskIndex = indexPath.row + 1;
    
    NSNumber *nProgress = [task valueForKey:@"porgress"];
    float progressValue = ([nProgress floatValue] / 100);
    
    completionDate = [task valueForKey:@"finishDate"];
    currendDate = [NSDate date];
    
    NSCalendar *calendar = ([[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar]);
    NSDateComponents *components = [calendar components:NSDayCalendarUnit fromDate:currendDate toDate:completionDate options:0];
    
    if (progressValue == 1) {
        dateIndexValue = 0.4;
        taskCountIndexValue = 0.1;
    } else {
        if (components.day <= 3) {
            dateIndexValue = 0.07;
        } else if (components.day >= 4 && components.day <= 10){
            dateIndexValue = 0.12;
        } else if (components.day >= 11 && components.day <= 20){
            dateIndexValue = 0.20;
        } else if (components.day >= 21 && components.day <= 30){
            dateIndexValue = 0.30;
        } else if (components.day >= 31){
            dateIndexValue = 0.4;
        }
        
        if (tasks.count >= 2) {
            taskCountIndexValue = 0.1;
        } else if (tasks.count <= 3 && tasks.count >= 5){
            taskCountIndexValue = 0.07;
        } else if (tasks.count <= 6 && tasks.count >= 10){
            taskCountIndexValue = 0.03;
        } else if (tasks.count >= 11){
            taskCountIndexValue = 0;
        }
    }
 
    
    priorityIndex = (progressValue / 2) + dateIndexValue + taskCountIndexValue;
    
    NSNumber *aPriorityIndex = [NSNumber numberWithFloat:priorityIndex];
    
    [tasks setValue:aPriorityIndex forKey:@"priorityIndex"];
    
    NSNumber *nIndexPriority = [task valueForKey:@"priorityIndex"];
    float fIndexPriority = [nIndexPriority floatValue];
    
    cell.textLabel.text = [NSString stringWithFormat:@"%i. %@", taskIndex,[task valueForKey:@"taskName"]];
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%1.2f", fIndexPriority]; //priorityIndex];
    NSManagedObjectContext *context = [self managedObjectContext];
    
    NSError *error = nil;
    // Save the object to persistent store
    if (![context save:&error]) {
        NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
    }
 
    
    UIImage *background = [UIImage imageNamed:@"cellbackground.png"];
    
    UIImageView *cellBackgroundView = [[UIImageView alloc] initWithImage:background];
    cellBackgroundView.image = background;
    cell.backgroundView = cellBackgroundView;
    
    return cell;
}
 
 
#pragma mark - Table view delegate
 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
 
@end


P.S. не бейте сильно тапками за чистоту кода, не было времени поприберать лишнее пока
0
21.03.2013, 13:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2013, 13:57

UITableView & UIButton
Доброго времени суток. Возник вопрос у меня есть таблица с 3-мя ячейками мне...

Особенности при работе с UITableView
Добрый день. С недавних пор начала писать программы под IOS поэтому прошу...

Как добавить блок AdMob на UITableView?
Здравствуйте! Возникла проблема при добавлении блока AdMob на UITableView....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru