webBG - програмисти, машинно обучение, javascript, python, php, питам, говорим, публикации

Проблем с изгледа на таблица в iOS при превъртане

Хей, момчета, имам проблем, имам табличен изглед с 4 изображения във всяка клетка, трябва да знам кое изображение е щракнато, затова сложих изображения на бутона

Всичко работи добре, но се задържа при превъртане, не се срива, просто заседна за секунда, след което превъртете отново. Може ли някой да помогне? ето кода:

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

UIButton *b1, *b2, *b3, *b4;
UIImageView *lBut1,*lBut2,*lBut3,*lBut4;
if (cell == nil)        
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

b1 = [UIButton buttonWithType:UIButtonTypeCustom];
b1.frame = CGRectMake(y, y, x, x);
UIImage* img = [UIImage imageWithContentsOfFile:[dataArray objectAtIndex:indexPath.row*4]];
[b1 setBackgroundImage:img forState:UIControlStateNormal];
b1.tag = indexPath.row*4+1;
[b1 addTarget:self action:@selector(reportChoose:) forControlEvents:UIControlEventTouchUpInside];
lBut1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Default.png"]];
lBut1.frame = CGRectMake(0, 0, x, x);
[lBut1 setAlpha:0.5];
[b1 addSubview:lBut1];
[lBut1 release];
[cell addSubview:b1];

if (indexPath.row * 4 + 1 < [dataArray count]) {
    b2 = [UIButton buttonWithType:UIButtonTypeCustom];
    b2.frame = CGRectMake(2*y+x, y, x, x);
    UIImage* img = [UIImage imageWithContentsOfFile:[dataArray objectAtIndex:indexPath.row*4 + 1]];
    [b2 setBackgroundImage:img forState:UIControlStateNormal];
    b2.tag = indexPath.row*4+2;
    [b2 addTarget:self action:@selector(reportChoose:) forControlEvents:UIControlEventTouchUpInside];
    lBut2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Default.png"]];
    lBut2.frame = CGRectMake(0, 0, x, x);
    [lBut2 setAlpha:0.5];
    [b2 addSubview:lBut2];
    [lBut2 release];
    [cell addSubview:b2];
}

if (indexPath.row * 4 + 2 < [dataArray count]) {
    b3 = [UIButton buttonWithType:UIButtonTypeCustom];
    b3.frame = CGRectMake(3*y+2*x, y, x, x);
    UIImage* img = [UIImage imageWithContentsOfFile:[dataArray objectAtIndex:indexPath.row*4 + 2]];
    [b3 setBackgroundImage:img forState:UIControlStateNormal];
    b3.tag = indexPath.row*4+3;
    [b3 addTarget:self action:@selector(reportChoose:) forControlEvents:UIControlEventTouchUpInside];
    lBut3 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Defaulte.png"]];
    lBut3.frame = CGRectMake(0, 0, x, x);
    [lBut3 setAlpha:0.5];
    [b3 addSubview:lBut3];
    [lBut3 release];
    [cell addSubview:b3];
}
if (indexPath.row * 4 + 3 < [dataArray count]) {
    b4 = [UIButton buttonWithType:UIButtonTypeCustom];
    b4.frame = CGRectMake(4*y+3*x, y, x, x);
    UIImage* img =[UIImage imageWithContentsOfFile:[dataArray objectAtIndex:indexPath.row*4 + 3]];
    [b4 setBackgroundImage:img forState:UIControlStateNormal];
    b4.tag = indexPath.row*4+4;
    [b4 addTarget:self action:@selector(reportChoose:) forControlEvents:UIControlEventTouchUpInside];
    lBut4 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Defaulte.png"]];
    lBut4.frame = CGRectMake(0, 0, x, x);
    [lBut4 setAlpha:0.5];
    [b4 addSubview:lBut4];
    [lBut4 release];
    [cell addSubview:b4];
}

return cell;

}


  • Тази таблица съдържа 4 изображения на ред и трябва да знам кое изображение е щракнато, затова използвам различен етикет за всеки бутон. 19.03.2012

Отговори:


1

клетките трябва да се използват повторно.
Добавяте все повече и повече бутони, когато клетките се превъртат. Разпределенията и добавянето на изгледи като подизглед отнема време.
Когато превъртате достатъчно дълго, ще ви свърши паметта.

Използвайте модел като този:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UIButton *button;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.tag = 1001;
        // configure button properties that never change between rows
        button.frame = ...

        [cell.contentView addSubview:button];
    }
    UIImage *myImage = ...

    button = (UIButton *)[cell.contentView viewWithTag:1001];
    // configure properties that are different for each row
    [button setBackgroundImage:myImage forState:UIControlStateNormal];
    return cell;
}

Добавете подизгледи само в if (cell == nil). Конфигурирайте ги извън това условие.

Или създайте подклас UITableViewCell, който държи вашите бутони.

16.03.2012
  • Но ако искам да намеря кой бутон е щракнат? 19.03.2012

  • 2

    Това е много често срещан проблем. Две точки, които трябва да кажа:

    1) Използвайте повторно клетките на tableView. (Доста често срещан подход от UITableView) 2) Кеширайте възможно най-много данни. Кеширането обаче увеличава отпечатъка на паметта, но също така ще подобри превъртането. Въпреки че нивото на кеширане трябва да се определи чрез подходящо тестване (използвайте инструменти за това).

    17.03.2012

    3

    Най-добрият метод е да създадете CUstom TableViewCell, за да улесните работата си.

    Можете да напишете селекторите в персонализирания клас tableviewcell.

    http://www.galloway.me.uk/tutorials/custom-uitableviewcell/

    16.03.2012
    Нови материали

    Записване на грешки — Как да записвате грешки във вашето приложение, за да ги отстраните по-късно
    Записването на грешки е важна част от „обработването на грешки“. Накратко, когато възникнат определени грешки в програмите, вие искате да знаете за това. Това е особено важно при грешки. Ти..

    Кратко въведение в теорията на графите
    Кратко въведение в теорията на графите Втора част: внедряване на python на пълни графики В моята предишна статия въведох три основни концепции за графите: върхове, ръбове и тегла. В тази..

    Днес ще пиша за машинно обучение. Смятам се за ентусиаст, а не за експерт, така че имайте това предвид. С това казано, искам...
    Днес ще пиша за машинно обучение. Смятам се за ентусиаст, а не за експерт, така че имайте това предвид. С това казано искам да обясня защо машинното обучение има значение. За да бъда съвсем..

    Какво е структурно типизиране и как Typescript го използва в своя полза?
    Всички знаят тези дни, че „Typescript е строго синтактично надмножество на JavaScript и добавя незадължително статично въвеждане към езика.“. Но какво всъщност означава? Защо миграцията от..

    3 начина за премахване на дубликати от масив в Javascript
    Вие сте уеб разработчик? Програмист ли си? Тогава ще сте запознати с JavaScript и различните му вградени функции, методи и т.н. за различни реализации, проблеми и цели. Един от тези широко..

    Архитектура и обучение на конволюционни невронни мрежи (7 точки):
    Тази публикация предоставя подробности за архитектурата на Конволюционната невронна мрежа (CNN), функциите и обучението на всеки слой, завършвайки с резюме на обучението на CNN...

    Създайте разширение за Chrome с помощта на Angular
    Този урок е базиран на манифеста на разширението на chrome версия 3 (MV3), а също и на Angular версия 2+ (2, 3 и...). Ако не сте използвали манифест версия 3, можете да следвате този урок ,..