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

Правильная обработка нажатя кнопки в TableView - Программирование iOS

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование iOS Где gamescene.m ? http://www.cyberforum.ru/ios-dev/thread1373796.html
Здравствуйте! Я хочу написать(в качестве обучения) игру по этой статье=> http://habrahabr.ru/post/225517/ . В ней говорится что слева в навигаторе файлов должен быть файл gamescene.m , а у меня...
Программирование iOS Сохранение фигуры, нарисованной тачем Доброго времени суток. Случалось ли кому-нибудь работать с "рисованием" на экране? Мне нужно, чтобы пользователь пальцем нарисовал любую фигуру - от линии до какой-то загогулины, сохранить это и... http://www.cyberforum.ru/ios-dev/thread1372884.html
Приложение не устанавливается на ios 8.1.3 Программирование iOS
Написал приложение в xcode 6, всем доволен, протестировал на 4s, все работает, пришёл друг с 5s, и на него приложение не ставится, у него стоит прошивка 8.1.3, а в моём xcode максимальная прошивка...
Что за ошибка CoreData Программирование iOS
Доброго времени суток. Я только начал программировать. Столкнулся с проблемой. При создании любой базы в CoreData выдает вот такую ошибку: CoreData: error: -addPersistentStoreWithType:SQLite...
Программирование iOS Не получается сделать unwind seque && подключить производный класс (XCode 6) http://www.cyberforum.ru/ios-dev/thread1368293.html
Доброго времени суток! Недавно начал изучать программирование на Objective C и разработку под iOS. Занимаюсь по статьям на developer.apple.com и иногда посматриваю видеоуроки (только по разработке...
Программирование iOS Не раскрывается (исчез) TableView на ScrollView Здравствуйте. Есть TableView, на обычной вьюхе всё работает нормально. Высота ячеек рассчитывается и т.д. Но вот когда я сделал вью контроллер freeform и задал необходимую высоту и ниже трех лейблов... подробнее

Показать сообщение отдельно
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 171

Правильная обработка нажатя кнопки в TableView - Программирование iOS

14.02.2015, 19:30. Просмотров 1258. Ответов 6
Метки (Все метки)

Здравствуйте. Пишу на Mono. Заполнил таблицу кастомными ячейками, состоящими из кнопки и лейбла и огбычными. При нажатии на кнопку в ячейке соответствующая ячейка должна удалиться. Вот код:
Кликните здесь для просмотра всего текста

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
public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
        {
            _tableView = tableView;
 
            var cur_lang =  _User_Data.cur_lang;
 
            if (TextLabelList.Count > 0)
                TextLabelList.RemoveRange (0, TextLabelList.Count);
 
            TextLabelList.Add (cur_lang._add_str);
            TextLabelList.Add (cur_lang._del_all);
 
            foreach (string str in _User_Data.name_mash_picker_list)
                TextLabelList.Add (str);
 
 
            //первые две и после основного списка ячейки идут с кнопкой
            if ((indexPath.Row < 2) || (indexPath.Row >= _User_Data.name_mash_picker_list_start_Count+2)) 
            {
                //"CellID_But"
                var cell = tableView.DequeueReusableCell ("CellID_But") as customViewCell_with_Button;
 
                if (cell == null)
                    cell = new customViewCell_with_Button ();
                    
 
                if (cell.cell_button.Tag == 0) {
                    cell.cell_button.Tag = indexPath.Row;
                    cell.cell_button.TouchUpInside += Touch_Delbtn_on_cell;
                }
                            
                cell.cell_Label.Text = TextLabelList [indexPath.Row];
 
                return cell;
            } 
            else
            {
                //далее обычные ячейки
                UITableViewCell cell = tableView.DequeueReusableCell ("cellIdentifier");
                // if there are no cells to reuse, create a new one
                if (cell == null)
                    cell = new UITableViewCell (UITableViewCellStyle.Default, "cellIdentifier");
                cell.TextLabel.Text = TextLabelList [indexPath.Row];;
                return cell;
            }
 
 
        }
 
 
               void Touch_Delbtn_on_cell(object sender, EventArgs e) //обработчик нажатия кнопки удалить
        {
            var but = (UIButton)sender;
            _User_Data.name_mash_picker_list.RemoveAt (but.Tag-2); //удалить элемент соответствующий кнопке
 
            _tableView.ReloadData ();
            System.IO.File.Delete (dbPath); //удалить файл
            BinaryWriter bw = new BinaryWriter(new FileStream(dbPath, FileMode.OpenOrCreate));
            for(int i=_User_Data.name_mash_picker_list_start_Count; i<_User_Data.name_mash_picker_list.Count; i++)  //переписать текущий список в файл
                bw.Write(Convert.ToDouble(_User_Data.name_mash_picker_list[i]));
            bw.Close(); 
 
        }

Но так как GetCell вызывается каждый раз при появлении ячейки на экране (например вышла из поля невидимости при скролле), то и обработчик события нажатия добавляется несколько раз и соответственно вызывается потом при нажатии тоже несколько раз. Что приводит к удалению не только своей но и соседних ячеек, так как те уже успели поменять свой индекс в списке. Никакой проверки на то, был ли уже добавлен объекту обработчик событий или нет, я не знаю.. Подскажите как быть в такой ситуации? Подобный вопрос я нашел на ксамариновском форуме, но решения я там что то не увидел: https://forums.xamarin.com/discussio...itableviewcell У меня есть конечно одна идея на этот счёт, но я ещё не проверял, насколько она рабочая. В общем кнопку на ячейке сделать объектом дочернего класса, наследованного от UIButton в котором лишь добавить свойство String_Tag, в которое при добавлении ячейки писалось бы то же самое что и на лейбле. А в обработчике нажатия искать элемент в списке с таким текстом и удалять. Таким образом заходить в обработчик может сколько угодно раз, но удалять только один, в остальных случаях он просто не найдет этот элемент в списке. Но это - костыль, а как правильно? Подскажите.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru