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

Не обновляются TableViewCells после удаления данных и reloadData - Программирование iOS/iPhone

Восстановить пароль Регистрация
 
Монфрид
 Аватар для Монфрид
1185 / 995 / 153
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
17.10.2013, 12:15     Не обновляются TableViewCells после удаления данных и reloadData #1
Столкнулся с такой проблемой, бьюсь который день.
Всё довольно просто: имеется 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 (или как то так). Ничего не помогает.

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

Принцип удаления в UITabBarController and UINavigationController Objective-C
TableView - изменение анимации удаления ячеек
Objective-C База данных пользователей, из каких данных составлять?
Запрет сдвига ячейки в режиме удаления в iOS7 и iOS8

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.10.2013, 13:16     Не обновляются TableViewCells после удаления данных и reloadData #2
До вашего кода вы все логично гвоорите, но после слов
Цитата Сообщение от Монфрид Посмотреть сообщение
после этого дебагом вижу, что заходит в numberOfRowsInSection, где видит что в массиве 0 элементов, и всё, в cellForRowAtIndexPath он не идёт. То есть данные как бы удалились, а ячейки как были с данными, так и остались.
оказывается что все не так?
В cellForRowAtIndexPath он и не должен заходить, ибо вы сами в numberOfRowsInSection сказали, что ячеек 0.
При этом
То есть данные как бы удалились, а ячейки как были с данными, так и остались.
Неправда.
Покажите код
Монфрид
 Аватар для Монфрид
1185 / 995 / 153
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
17.10.2013, 13:26  [ТС]     Не обновляются TableViewCells после удаления данных и reloadData #3
Цитата Сообщение от zulkis Посмотреть сообщение
В cellForRowAtIndexPath он и не должен заходить, ибо вы сами в numberOfRowsInSection сказали, что ячеек 0.
ок, пусть так.
Таблица как бы обновилась, она подстроилась под то, что там внутри нет ячеек, т.к она не скроллится вниз. Но ячейки остаются заполненными.

И какой вам код казать? Как создаются cells в cellForRow или какой?
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.10.2013, 13:30     Не обновляются TableViewCells после удаления данных и reloadData #4
Ну где у вас эти все методы реализованы? Вашего ViewController, наверное
Монфрид
 Аватар для Монфрид
1185 / 995 / 153
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
17.10.2013, 23:41  [ТС]     Не обновляются TableViewCells после удаления данных и reloadData #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
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
18.10.2013, 06:34     Не обновляются TableViewCells после удаления данных и reloadData #6
зачем вы вот это делаете в 38 строке?
Objective-C
1
UITableViewCell *cell=[[UITableViewCell alloc]init];
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
18.10.2013, 07:48     Не обновляются TableViewCells после удаления данных и reloadData #7
У вас 1 tableView? Есть ли UISearchDisplayViewController?
Монфрид
 Аватар для Монфрид
1185 / 995 / 153
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
18.10.2013, 10:27  [ТС]     Не обновляются TableViewCells после удаления данных и reloadData #8
Цитата Сообщение от zulkis Посмотреть сообщение
У вас 1 tableView? Есть ли UISearchDisplayViewController?
других таблиц нет, UISearchDisplayViewController нет

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

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

Но речь не об этом. Я предлагаю вам убрать все лишнее, оставить Только загрузку базовых объектов и их отображение и перезагрузку tableView. Затем просто доработать скелет.
Правда сложно разобраться, что происходит.
Yandex
Объявления
18.10.2013, 10:59     Не обновляются TableViewCells после удаления данных и reloadData
Ответ Создать тему

Метки
objectivec, uitableview
Опции темы

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