Форум программистов, компьютерный форум CyberForum.ru

Программирование iOS/iPhone

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
#1

Сортировка в UITableView - Программирование iOS

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

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

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

UITableView Section - Objective-C
Доброго времени суток. Вопрос состоит в следующем. Есть таблица в стиле Grouped. Есть одна секция с тремя ячейками и в footer есть...

UITableView запутался с вьюхой - Программирование iOS
Коллеги что-то я запутался. Есть storyboard, в нем UIViewController с UITableView. Из таблички UI элементов перетягиваю UIView... его можно...

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

Передать из UITableView в UIWebView - Swift
Всем привет! Являюсь новичком Swift. Помогите, пожалуйста, передать данные из UITableView в UIWebView таким образом: lesson 1 ->...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
14.03.2013, 18:13     Сортировка в UITableView #2
1. Ячейки сортируются в датасорсе.
2. Причин масса может быть. Первая - устройство датасорса. В любом случае должен спасти метод - (void)scrollToRowAtIndexPathNSIndexPath *)indexPath atScrollPositionUITableViewScrollPosition)scrollPosition animatedBOOL)animated
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
14.03.2013, 19:02  [ТС]     Сортировка в UITableView #3
А не подскажете как вводить параметры на сортировку в датасорсе?
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
14.03.2013, 20:29     Сортировка в UITableView #4
Код датасорса в студию. Будем думать. А то вопрос из серии "Почему у соседа машина не едет?"
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
15.03.2013, 01:49  [ТС]     Сортировка в UITableView #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
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
15.03.2013, 08:27     Сортировка в UITableView #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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2013, 13:57     Сортировка в UITableView
Еще ссылки по теме:

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

Работа с жестами в UITableView - Программирование iOS
Разрабатываем приложение, столкнулись с проблемой жестов в uitableView. в кратце поясню, реализуем так называймый siebar который доступен...

UITableView - footer не уходит за экран - Objective-C
Всем привет! Есть проблема с проектом: дали исходник, и на одном из нескольких контроллеров у tableview после загрузки loadmore не уходит...

Особенности при работе с UITableView - Программирование iOS
Добрый день. С недавних пор начала писать программы под IOS поэтому прошу сильно не кидать тапками :) (всего месяц штудирования...


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

Или воспользуйтесь поиском по форуму:
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
21.03.2013, 13:57  [ТС]     Сортировка в UITableView #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. не бейте сильно тапками за чистоту кода, не было времени поприберать лишнее пока
Yandex
Объявления
21.03.2013, 13:57     Сортировка в UITableView
Ответ Создать тему
Опции темы

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