Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование iOS/iPhone
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Монфрид
1211 / 1021 / 293
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
1

Не обновляются TableViewCells после удаления данных и reloadData

17.10.2013, 12:15. Просмотров 857. Ответов 8

Столкнулся с такой проблемой, бьюсь который день.
Всё довольно просто: имеется TableView, вставленный в ViewController. Соответственно, все методы делагата для TableView прописаны у ViewController.
В TableView вставлены кастомные TableViewCells (наследую TableViewCell).
TableView в кач-ве источника данных использует MutableArray.
А теперь сама проблема: данные в таблице отображаются как надо. Но после некоторых действий юзера мне нужно удалить все данные в MutableArray и соответственно обновить TableView.
Пишу шаблонные строки кода для этого:
Objective-C
1
2
[arr removeAllObjects];
[self.tableView reloadData];
после этого дебагом вижу, что заходит в numberOfRowsInSection, где видит что в массиве 0 элементов, и всё, в cellForRowAtIndexPath он не идёт. То есть данные как бы удалились, а ячейки как были с данными, так и остались.

Смотрел после reloadData visibleCells у TableView, там их 0.

Что я делаю не так?
пробовал всякие setNeedsDisplay, setUpdateLayout (или как то так). Ничего не помогает.

Буду сильно благодарен помощи.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2013, 12:15
Ответы с готовыми решениями:

Не обновляются данные в БД после удаления строки в DataGridView
Здравствуйте. Подскажите, пожалуйста, в чем может быть проблема. При...

После редактирования данных в БД, данные на форме обновляются только после перезапуска программы
Добрый день! Прошу помощи. Пишу программу Form1 работает с полями из БД MS...

Восстановление данных после удаления раздела
Здравствуйте, Уважаемые пользователи форума CyberForum. Вообщем постараюсь...

Востановление данных после удаления диска?
Добрый день! hdd ST3200822a - 200Gb - было 2а раздела на 20 гб и на 180. ...

Восстановление данных после удаления и пересоздания логического раздела
Народ, помогите разобраться с восстановлением данных с жесткого диска....

8
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
17.10.2013, 13:16 2
До вашего кода вы все логично гвоорите, но после слов
Цитата Сообщение от Монфрид Посмотреть сообщение
после этого дебагом вижу, что заходит в numberOfRowsInSection, где видит что в массиве 0 элементов, и всё, в cellForRowAtIndexPath он не идёт. То есть данные как бы удалились, а ячейки как были с данными, так и остались.
оказывается что все не так?
В cellForRowAtIndexPath он и не должен заходить, ибо вы сами в numberOfRowsInSection сказали, что ячеек 0.
При этом
То есть данные как бы удалились, а ячейки как были с данными, так и остались.
Неправда.
Покажите код
1
Монфрид
1211 / 1021 / 293
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
17.10.2013, 13:26  [ТС] 3
Цитата Сообщение от zulkis Посмотреть сообщение
В cellForRowAtIndexPath он и не должен заходить, ибо вы сами в numberOfRowsInSection сказали, что ячеек 0.
ок, пусть так.
Таблица как бы обновилась, она подстроилась под то, что там внутри нет ячеек, т.к она не скроллится вниз. Но ячейки остаются заполненными.

И какой вам код казать? Как создаются cells в cellForRow или какой?
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
17.10.2013, 13:30 4
Ну где у вас эти все методы реализованы? Вашего ViewController, наверное
0
Монфрид
1211 / 1021 / 293
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
17.10.2013, 23:41  [ТС] 5
ок, вечером тогда, спасибо что помогаете

Добавлено через 10 часов 7 минут
zulkis,
вот код, я поубирал оттуда логику загрузки с веб сервиса, а так здесь всё почти
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
- (void)viewDidLoad
{
    [super viewDidLoad];
    filteredRecipes=[[NSMutableArray alloc]init];
    nameRecipeSearch=YES;
}
 
#pragma mark TableViewDelegate
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (filteredRecipes.count>0 && filteredRecipes.count!=recipesCount) {
        return filteredRecipes.count+1;
    }
    else
        return filteredRecipes.count;
}
 
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UILabel *lblHeader=[[UILabel alloc]init];
    lblHeader.font=[UIFont fontWithName:@"HoeflerText-Italic" size:16];
    lblHeader.text=[NSString stringWithFormat:@"тратата: %d",recipesCount];
    return lblHeader;
}
 
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 20;
}
 
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 60;
}
 
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell=[[UITableViewCell alloc]init];
    if (indexPath.row>=filteredRecipes.count) {
        if (filteredRecipes.count>0) {
            cell=[tableView dequeueReusableCellWithIdentifier:@"RecipesLoadingCell" forIndexPath:indexPath];
            if (cell==nil) {
                cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"RecipesLoadingCell"];
            }
        }
    }
    else
    {
        RMRecipeFilterCell *cell=[tableView dequeueReusableCellWithIdentifier:@"RecipeCell" forIndexPath:indexPath];
        if (cell==nil) {
            cell=[[RMRecipeFilterCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"RecipeCell"];
        }
        RMRecipe *recipe=filteredRecipes[indexPath.row];
        cell.recipeNameLabel.text=recipe.recipeName;
        cell.cookTimeLabel.text=recipe.cookTime;
        cell.recipeNumLabel.text=[NSString stringWithFormat:@"%d",indexPath.row+1];
    }
    return cell;
}
 
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"count:%d",filteredRecipes.count);
    if (!loading&& indexPath.row<recipesCount&& indexPath.row+1>filteredRecipes.count) {
            int currentPage=indexPath.row/10;
            NSLog(@"pageNum:%d",currentPage);
            loading=YES;
            if (nameRecipeSearch) {
//
                     [filteredRecipes addObjectsFromArray:recipes];
                     [self.filterTableView reloadData];
                     loading=NO;
         
            }
            else
            {
                //
                     [filteredRecipes addObjectsFromArray:recipes];
                     [self.filterTableView reloadData];
                 }];
            }
        }
}
 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.recipeSearchBar.isFirstResponder) {
        [self.recipeSearchBar resignFirstResponder];
    }
}
 
 
#pragma mark SearchBarDelegate
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    if (searchBar.text.length>=3 && searchBar.text!=lastSearchString) {
        [filteredRecipes removeAllObjects];
        [self.filterTableView reloadData];
        if (nameRecipeSearch) {
//
                 [filteredRecipes removeAllObjects];
                 recipesCount=recipeCount;
                 if (recipeCount>0) {
                          filteredRecipes=[NSMutableArray arrayWithArray:recipes];
                          NSLog(@"RELOAD");
                           [self.filterTableView reloadData];
                 }
          lastSearchString=searchBar.text;
             }];
 
        }
        else
        {
            //
                 [filteredRecipes removeAllObjects];
                 recipesCount=count;
                 if (recipesCount>0) {
                     
//   NSLog(@"RELOAD");
                          [self.filterTableView reloadData];    
                                  lastSearchString=searchBar.text;
             }
        }
        [searchBar resignFirstResponder];
    }
}
 
- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar
{
    searchBar.text=nil;
    [searchBar resignFirstResponder];
    lastSearchString=nil;
    [filteredRecipes removeAllObjects];
    recipesCount=0;
    [self.filterTableView reloadData];
}
 
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if (searchBar.text.length==0) {
        lastSearchString=nil;
        [filteredRecipes removeAllObjects];
        recipesCount=0;
        [self.filterTableView reloadData];
       
    }
}
 
- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope NS_AVAILABLE_IOS(3_0)    
{
    if(selectedScope==0){
        searchBar.placeholder=@"тратата";
        nameRecipeSearch=YES;
    }
    else{
        searchBar.placeholder=@"тратата";
        nameRecipeSearch=NO;
    }
    recipesCount=0;
    searchBar.text=@"";
    [filteredRecipes removeAllObjects];
    [self.filterTableView reloadData];
}
 
@end
0
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
18.10.2013, 06:34 6
зачем вы вот это делаете в 38 строке?
Objective-C
1
UITableViewCell *cell=[[UITableViewCell alloc]init];
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
18.10.2013, 07:48 7
У вас 1 tableView? Есть ли UISearchDisplayViewController?
0
Монфрид
1211 / 1021 / 293
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
18.10.2013, 10:27  [ТС] 8
Цитата Сообщение от zulkis Посмотреть сообщение
У вас 1 tableView? Есть ли UISearchDisplayViewController?
других таблиц нет, UISearchDisplayViewController нет

Цитата Сообщение от glvrzzz Посмотреть сообщение
зачем вы вот это делаете в 38 строке?
ну да, наверно можно просто
Objective-C
1
UITableViewCell *cell;
а, нет, так вываливается с ошибкой
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
18.10.2013, 10:59 9
Монфрид, Вообще по логике нужно Сначала попробовать зареюзать, затем если ничего в деке(наш случай)/хэшмапе нет, то создавать новый экземпляр.
"вываливается" говорите? А ведь не должно, у вас if... else... полное перекрытие создания...
Получается "if (filteredRecipes.count>0) {" условие не срабатывает?

На мой взгляд, ваш код "с запашком". Я бы взял и ваш "loadingCell" переместил в footer... Имхо, это лучше решение в вашем случае.
И не очень ясна логика разделения массивов рецептом и отфильтрованных рецептов.
Objective-C
1
if (!loading&& indexPath.row<recipesCount&& indexPath.row+1>filteredRecipes.count)
Ну куда это годно?

Но речь не об этом. Я предлагаю вам убрать все лишнее, оставить Только загрузку базовых объектов и их отображение и перезагрузку tableView. Затем просто доработать скелет.
Правда сложно разобраться, что происходит.
0
18.10.2013, 10:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2013, 10:59

Возможно ли восстановление данных после удаления раздела и установки ОС?
Добрый день. Недавно переустановил Ос на компьютере пользователя. Во время...

После удаления таблицы не уменьшается размер базы данных
Добрый день. Microsoft SQL Server 2008. С базы данных через SQL Server...

После удаления базы данных из SQL Server не могу подключится
В Managment Studio удалил добавленные мной базы данных. Теперь не могу...


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

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

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