Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: В одной ячейке таблицы несколько повторяющихся элементов

Добрый день. Прошу помощи в виде совета, а не просьбы написать вместо меня. Учусь работать с VK API и решил вывести посты со стены юзера. Если по одному типу данных в ячейке (одна аудиозапись, одно видео, текст, репост) то все просто и это я реализовал, но потом стал вопрос, что делать если в одном посту будет две фотографии или две и больше аудиозаписи)? Раньше было один пост = одна ячейка таблицы (для каждого типа поста своя кастомная ячейка), но как поступить теперь я даже не могу придумать. Была идея все посты сделать массивами, что бы в массиве постов были массивы с находящимися элементами (где два элемента в массиве где 5), но ничего не получается, так как в один массив добавляются данные из других постов (по типам они одинаковые, но должны быть в разных ячейках). Такого элемента как идентификатор поста я не нашел (что бы сравнивать если эта фотка принадлежит этому посту то добавляем к массиву, если нет то создаем новый. Именно в этом месте я и застрял даже идей уже нет.

Даже если я распределю данные по массивам, как их потом правильно отображать, если с картинками все просто, внутрь ячейки вкинуть колекшнВью и в Колекшине отображать картинки, то как с аудиозаписями поступить? Засунуть внутрь ячейки еще один tableView и уже во внутреннем TV отображать аудиозаписи (вариант хорош тем, что у меня сохранится контроль над кнопкой запуска/остановки файла), но а вообще как этот вариант?
Буду благодарен за помощь в первую очередь интересует то как эти данные сохранить (может в классах или родительском классе создать какое то свойство или массив)
Ответ:
Сообщение от Slava-hacker32
Такого элемента как идентификатор поста я не нашел
вот честно незнаком с вк апи, но может быть они банально по таймстемпу разделяются?
не уверен что за одну секунду реально создать несколько постов, а если и реально, то возможно время уточняется по миллисекундам?

поискал - вот есть , как по мне все доступно описано, как решить ваш первый вопрос,
айдишники есть, все гут

Сообщение от Slava-hacker32
если с картинками все просто, внутрь ячейки вкинуть колекшнВью и в Колекшине отображать картинки, то как с аудиозаписями поступить? Засунуть внутрь ячейки еще один tableView и уже во внутреннем TV отображать аудиозаписи (вариант хорош тем, что у меня сохранится контроль над кнопкой запуска/остановки файла), но а вообще как этот вариант?
второе - а чем колекшн вью "проще" или лучше чем тейбл вью?
как по мне - одно и тоже
раз считаете, что колекшн вью - ок, тогда таблица - тоже ок
другой вопрос - кто будет датасорсом для этих таблиц или колекшнов внутри ячеек
так тут я бы конечно выделил отдельные классы для этого и сделал бы их переменными внутри основного датасорса или контроллера, чтобы они могли тригерить ему свои ивенты, за которые они не могут принять решения сами,
но ради всего святого, не делайте ячейку датасорсом, ячейка - это просто вью

Вопрос: Динамическая высота ячейки

Добрый день. Подскажите как посчитать высоту ячейки? Все приметы которые я нашел в инете, считают высоту ячейки в зависимости от текста в label. У меня же внутри ячейки containerCell находится tableView внутри которого находится n-тое кол=во ячеек с разной высотой. Думал через layout сделать, но не могу понять, что к чему привязывать, в примере с label было понятно что лебл есть всегда просто изменяется его высота, в варианте с ячейками не известно какие там, внутри, будут ячейки и с какой высотой (определяется все это уже при анализе ответа с сервера), или размер containerCell будет меняться в зависимости от размера tableView находящегося внутри или contentView (или как там оно)
Ответ: Я изучаю vk api и решил сделать отображение постов на стенке юзера. Так как в посте могут быть вложения разного типа (аудио, видео, текст, картинка) этим и вызвано вложение в ячейку, которая отвечает за пост, доп. ячеек для каждого типа вложения. А вообще за секции я как то и позабыл, спасибо, что подсказали
Вопрос: Как поймать момент, когда ячейка UITableView показалась на экране?

начал для этого использовать tableView:willDisplayCell:forRowAtIndexPath:
но если там сделать [tableView cellForRowAtIndexPath:indexPath] то ячейку мы не получим, получается её ещё нет в таблице
Ответ: когда ячейка отобразилась на экране
я по indexPath ячейки получаю id материала
и добавляю в очередь загрузку картинки для материала с данным id
когда подходит очередь картинки надо проверить есть ли эта ячейка на экране и изменить на ней индикатор загрузки

Добавлено через 1 минуту
из-за того что очередь подходила раньше раньше отображения картинки, то не где было менять индикатор

Добавлено через 45 секунд
но я уже это переделал, теперь индикатор меняется в модели
Вопрос: Правильная обработка нажатя кнопки в TableView

Здравствуйте. Пишу на 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, в которое при добавлении ячейки писалось бы то же самое что и на лейбле. А в обработчике нажатия искать элемент в списке с таким текстом и удалять. Таким образом заходить в обработчик может сколько угодно раз, но удалять только один, в остальных случаях он просто не найдет этот элемент в списке. Но это - костыль, а как правильно? Подскажите.
Ответ:
Метод dequeueReusableCell (начиная с какого-то обновления iOS) сам создает ячейку при необходимости (хотя кажется это работает только если табличка в сториборде, для нибов все по старому).
Я как раз со сторибордом и работаю.
Можно удалить все предыдущие обработчики перед добавлением нового.
Можно, но не известно сколько их было добавлено до этого, чтобы знать сколько удалять.
Можно передавать в кастомную ячейку блок, который будет вызываться при нажатии кнопки (или что там в C# вместо блоков? Лямбды?).
Не до конца понял что вы имеете в виду.
В общем сегодня сделал так, как задумывал на выходные. И все заработало. Переопределил класс кнопки кастомной ячейки дочерним классом от UIButton, добавив в него строковое свойство Tag_String.
И в GetCell написал такой вот код:
Код C#
1
2
3
4
5
6
cell.cell_button.Tag = indexPath.Row;
if(cell.cell_button.Tag_String==null)
        cell.cell_button.TouchUpInside += Touch_Delbtn_on_cell;
cell.cell_button.Tag_String=TextLabelList[indexPath.Row];
cell.cell_button.SetBackgroundImage(image, UIControlState.Normal);
cell.cell_Label.Text = TextLabelList [indexPath.Row];
А в обработчике нажатия вот такой:
Кликните здесь для просмотра всего текста

Код 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
    void Touch_Delbtn_on_cell(object sender, EventArgs e)
        {
            var button = (UIMyButton_on_cell)sender;
 
            if (button.Tag == 0) {
                Add_new_element (_tableView);
                return;
            }
            if (button.Tag == 1) {
                Del_all_element (_tableView);
                return;
            }
 
            var findindex = _User_Data.name_mash_picker_list.FindIndex(x => x.Equals(button.Tag_String)); //найти элемент в списке с такой строкой.
            
        
            if(findindex>1)
                _User_Data.name_mash_picker_list.RemoveAt (findindex);//удалить этот элемент
                
            _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(); 
 
        }

Теперь в обработчик заходит только один раз и делает все что мне надо. Всем спасибо!
Вопрос: Table View Controller не видно ячеек

Здравствуйте.
Я новичек и решил начать с чтения данной ссылки (Start Developing iOS Apps Today)
Там добавляется Table View Controller, дальше он заполняется (статическими) данными.

Вопрос в том что я не вижу информацию в ячейках. Как её увидеть?
У меня OS X 11b8 и Xcode 7b6. Догадываюсь что проблема из-за этого, но переустанавливать OS как то не хочется.
Ответ: Спасибо , мелочь, а найти долго не мог, уже забросил данный tutorial и по другому начал делать.
Вопрос: Конфликтующие жесты

доброго времени суток!

Наш программист парит нам мозги. вот хотел узнать мнения программистов.
сначала скажу что я не IOS программист.
в приложение есть меню который открывается с жестом пальца справа на лево. и есть ячеек которые надо удалить с жестом пальца с лево на права. вот и он говорит что, что то с кем то конфликтует. мениу открывается нормально. а вот чтобы удалить ячейку надо очень стараться...
возможно такое или все таки он парит нам мозги???
Ответ: Да вполне возможная ситуация. Но это лечится добавлением пары строчек кода в обработчик "жестов", или как вариант сделать удаление ячеек не нативным (тап справа на лево) а, например, по лонгтапу...
Вопрос: Как оптимизировать код objective-c?

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

NSString *filePath1 = [NSString stringWithFormat:@"%@",responsePhotos[0]];
NSURL *imgurl=[NSURL URLWithString:filePath1];
dispatch_queue_t queue =     dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
   NSData *dataimage1 = [NSData dataWithContentsOfURL:imgurl];
   UIImage *imim1 = [UIImage imageWithData:dataimage1];
    dispatch_async(dispatch_get_main_queue(), ^{
        if (imim1==nil) {
            cell.imgauto1.image=[UIImage imageNamed:@"camera_a.gif"];
        }else{
            cell.imgauto1.image=imim1;
        }
    });
});

Ответ:
Спасибо, за Ваш совет. Можете помочь с этим: В методе viewDidLoad я должен загрузить часть изображений, и уже передать их скачанные в ячейку, и назначить. Почему часть, потому что качать например 100 картинок, это значит что пользователь будет все это время ждать их загрузки, хочу использовать infinityscroll и pulltorefresh, принцип такой:дойдя до конца таблицы, 10 ячейки, например, начну загрузку еще 10 штук, и потом обновлю таблицу. для кеширование хочу использовать SDWebImageCash. У меня не получаеться это реализовать. Мне б хоть какой-то пример как это реализовано.
Вопрос: Текст в таблице при первом запуске

Вечер добрый. Приложение при первом запуске скачивает из инета данные. Мне бы хотелось что бы при первом запуске приложения в первой ячейке таблицы показывался текст "Loading...". Вот как это сделать? В метод cellForRowAtIndexPath заходит только когда данные уже получены, соответственно там проверка пуст источник данных или нет не работает.
Ответ:
Цитата Сообщение от Slava-hacker32 Посмотреть сообщение
В метод cellForRowAtIndexPath заходит только когда данные уже получены
это как еще?
в этот метод таблица стучится сразу же, как только поймет сколько ячеек нужно отрисовать

соответственно в реализации метода делегата датасорса (numberOfRowsInSection) вы возвращаете 1 и в cellForRowAtIndexPath рисуете "Loading..."

когда данные подгрузились, в numberOfRowsInSection вы возвращаете кол-во айтемов и в cellForRowAtIndexPath, соответственно, рисуете нужный айтем
Вопрос: TextField на CustomCell почему-то неактивно.

Таблица состоит из , CustomCell-ячеек (TableViewCell), на которых расположены текстовые поля (для ввода значения).  Почему-то при клике на поле ничего не происходит (ни поле активным не становится, ни клавиатура виртуальная не вылетает).  Более того, на 100% не уверен, но вроде бы и программно это поле не меняется.
Ответ:
ммм... ирония вполне законна, спасибо... :good 

хорошо.  код в Контроллере:
Код


- (UITableViewCell *) tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger row = [indexPath row];
    NSMutableDictionary* tmpDict = [groupsArray objectAtIndex:row];

    static NSString *identID = @"GroupCell";
    GroupCell* cell = nil;
    cell = (GroupCell *) [tableView dequeueReusableCellWithIdentifier: identID];
    
    if(!cell)
    {
        NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"GroupCell" owner:nil options:nil];
        for (id currentObject in topLevelObjects)
        {
            if ([currentObject isKindOfClass:[GroupCell class]])
            {
                cell = (GroupCell *) currentObject;
                break;
            }
        }
    }
    
    cell.groupId.text = [tmpDict objectForKey:@"collection_id"];
    cell.groupName.text = [tmpDict objectForKey:@"name"];
    
    return cell;    
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger row = [indexPath row];
    NSMutableDictionary* texts = [groupsArray objectAtIndex:row];
    
    MySingleton* st = [[MySingleton alloc] init];
    [st setArtgroupName:[texts objectForKey:@"name"]];
    [st setArtgroupId:[texts objectForKey:@"collection_id"]];
    
    ArticleViewController *ac = [[ArticleViewController alloc] initWithNibName:nil bundle:nil];
    ac.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentViewController:ac animated:YES completion:nil];
    
    return;
}


код ячейки:
Код

+(GroupCell *) cell
{
    NSArray* objects = [[NSBundle mainBundle] loadNibNamed:@"GroupCell" owner:nil options:nil];
    return [objects objectAtIndex:0];
}

+(NSString *) cellID {return @"GroupCell";}


объявление контроллера:

Код

@interface GroupViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

Вопрос: COWALL: первый офферволл, одобренный Apple

На конференции White Nights: Mobile Games компания Anix презентовала новый полезный продукт для разработчиков под названием COWALL.

COWALL - это первый офферволл, одобренный Apple. 
Новый прозрачный и справедливый инструмент для монетизации вашего приложения 
Заработайте деньги на приложениях так, как раньше, или даже больше!

COWALL отображается на основе лучших рейтингов лидеров iTunes. Это не реклама игр и приложений других людей - не incent трафик, который Apple запретили в июне 2014 года. 
Пользователи взаимодействуют с контентом iTunes (музыка, подкасты и видео) с высокой степенью вовлечения
Пользователи остаются внутри приложения
Используйте COWALL чтобы монетизировать текущих пользователей 

Вы получите комиссию от покупок, которые сделали ваши игроки в ITunes и AppStore, все транзакции проходят для каждого пользователя в течение 24 часов. Мы предлагаем пользователю лидеров ТОП-25 iTunes. Наше кредо - показывать не рекламный контент, а тот, который реально интересен пользователю.
Ваши игроки впервые получают шанс пополнять игровую валюту в вашей игре, скачивая подкасты и музыкальные композиции, телешоу и кинофильмы. Ваши игроки продолжают пользоваться удобным инструментом вознаграждения за действия, вы не теряете эту часть своего дохода в приложении, которую получали при использовании старых форматов Оффер-волл.

С помощью наших технологий оптимизации выдача настраивается под каждого отдельного юзера, что увеличивает конверты  CTR  и CVR.

• Готовый framework - встраивается в любое приложение за считанные минуты 
• Различные интересный контент: CTR до 35% 
• Оптимизированная подача платного контента позволяет увеличить продажи здесь и сейчас 
• Подробная статистика и регулярные платежи 

Используя COWALL сегодня, вы ничего не теряете - продолжайте зарабатывать на offerwall без риска быть отвергнутым Apple.

Просто установить - еще проще заработать. 
Зарегистрируйтесть на на  и скачайте SDK бесплатно

Ответ:
На конференции White Nights: Mobile Games компания Anix презентовала новый полезный продукт для разработчиков под названием COWALL.

COWALL - это первый офферволл, одобренный Apple. 
Новый прозрачный и справедливый инструмент для монетизации вашего приложения 
Заработайте деньги на приложениях так, как раньше, или даже больше!

COWALL отображается на основе лучших рейтингов лидеров iTunes. Это не реклама игр и приложений других людей - не incent трафик, который Apple запретили в июне 2014 года. 
Пользователи взаимодействуют с контентом iTunes (музыка, подкасты и видео) с высокой степенью вовлечения
Пользователи остаются внутри приложения
Используйте COWALL чтобы монетизировать текущих пользователей 

Вы получите комиссию от покупок, которые сделали ваши игроки в ITunes и AppStore, все транзакции проходят для каждого пользователя в течение 24 часов. Мы предлагаем пользователю лидеров ТОП-25 iTunes. Наше кредо - показывать не рекламный контент, а тот, который реально интересен пользователю.
Ваши игроки впервые получают шанс пополнять игровую валюту в вашей игре, скачивая подкасты и музыкальные композиции, телешоу и кинофильмы. Ваши игроки продолжают пользоваться удобным инструментом вознаграждения за действия, вы не теряете эту часть своего дохода в приложении, которую получали при использовании старых форматов Оффер-волл.

С помощью наших технологий оптимизации выдача настраивается под каждого отдельного юзера, что увеличивает конверты  CTR  и CVR.

• Готовый framework - встраивается в любое приложение за считанные минуты 
• Различные интересный контент: CTR до 35% 
• Оптимизированная подача платного контента позволяет увеличить продажи здесь и сейчас 
• Подробная статистика и регулярные платежи 

Используя COWALL сегодня, вы ничего не теряете - продолжайте зарабатывать на offerwall без риска быть отвергнутым Apple.

Просто установить - еще проще заработать. 
Зарегистрируйтесть на на  и скачайте SDK бесплатно