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

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

Войти
Регистрация
Восстановить пароль
 
Монфрид
1194 / 1004 / 153
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
#1

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

17.10.2013, 12:15. Просмотров 707. Ответов 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 (или как то так). Ничего не помогает.

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

Принцип удаления в UITabBarController and UINavigationController - Objective-C
Здравствуйте. Кто-нибудь знает принцип по которому UITabBarController and UINavigationController работают со свои стеком контролов. ...

TableView - изменение анимации удаления ячеек - Программирование iOS
Всем привет! Есть такая ситуация: Заказчик приложения возмущен новой анимацией удаления ячеек в iOS7 и хочет, "чтобы было, как...

Запрет сдвига ячейки в режиме удаления в iOS7 и iOS8 - Программирование iOS
Всем привет! Появилась у меня задача реализовать перевод UITableView в режим редактирования таким образом, чтобы красная круглая...

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

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

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

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

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

И какой вам код казать? Как создаются cells в cellForRow или какой?
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.10.2013, 13:30     Не обновляются TableViewCells после удаления данных и reloadData #4
Ну где у вас эти все методы реализованы? Вашего ViewController, наверное
Монфрид
1194 / 1004 / 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
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
18.10.2013, 07:48     Не обновляются TableViewCells после удаления данных и reloadData #7
У вас 1 tableView? Есть ли UISearchDisplayViewController?
Монфрид
1194 / 1004 / 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;
а, нет, так вываливается с ошибкой
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2013, 10:59     Не обновляются TableViewCells после удаления данных и reloadData
Еще ссылки по теме:

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

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

Строковый тип данных: после удаления определить количество оставшихся символов - Pascal ABC
подскажите! как после удаления в строке символов подсчитать кол-во НЕ тронутых?

После удаления (перезаписи) данных из бинарного файла, файл всё равно существует, несмотря на то, что он пуст - C++
после удаления(перезаписи) данных из бинарного файла, файл всё равно существует, как сделать так чтобы и файл удалялся если он пустой?

Не обновляются данные в окне после добавления записи - C# WPF
Доброго времени суток. Есть таблица на Access. Отображается с помощью DataSet + DataGridControl в окне №1. В окне №2 с помощью...


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

Или воспользуйтесь поиском по форуму:
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
Ответ Создать тему
Опции темы

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