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

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

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

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

17.10.2013, 12:15. Просмотров 729. Ответов 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 (Программирование iOS):

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

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

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

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

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

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

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

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

Цитата Сообщение от glvrzzz Посмотреть сообщение
зачем вы вот это делаете в 38 строке?
ну да, наверно можно просто
Objective-C
1
UITableViewCell *cell;
а, нет, так вываливается с ошибкой
zulkis
682 / 609 / 38
Регистрация: 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. Затем просто доработать скелет.
Правда сложно разобраться, что происходит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2013, 10:59
Привет! Вот еще темы с ответами:

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

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

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

После redirect данные на странице dg.aspx не обновляются - C# ASP.NET
Есть такая связка: - страница dg.aspx (на ней размещен DataGrid на основе инфы из базы) - страница delete.aspx (ей передается id...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.10.2013, 10:59
Ответ Создать тему
Опции темы

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