UITableView несколько разделов с элементами GUI UIButton, UISwitch и т. Д. - PullRequest
1 голос
/ 26 октября 2011

Я уже целый день ломал голову над этой проблемой ... Я искал этот форум, а также Google, другие блоги и т. Д. Все безрезультатно.

То, что я делаю, - это создание UITableView с несколькими разделами, и в каждом разделе каждый ряд имеет свой элемент GUI (то есть экран настроек)

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 3;
}

и все, чего я хочу добиться, - это чтобы каждый раздел имел различные элементы графического интерфейса в разных ячейках. НО, как вы можете видеть на этом скриншоте:

http://twitpic.com/75qix5/full

Изначально все выглядит так, как должно, но после прокрутки вверх и вниз один раз возникают проблемы. Элементы начинают перемешиваться, и чем больше / больше вы прокручиваете ВВЕРХ и ВНИЗ, тем больше элементы перемещаются.

! ["UITableView с элементами графического интерфейса в разделах и строках. Ошибка? Сбой? Невежество?"] [2]

Это ошибка? Сбой? или невежество? (вероятно, последний) - я удалил весь другой код, кроме кода GUI, и если это что-то значит, я создаю UITableView, используя NIB

Кроме того, вот код для моего cellForRowAtIndexPath метода. Я буду вечно благодарен, если кто-то может указать мне правильное направление или сказать мне, что я делаю неправильно.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }


    // Set up the cell
    // desired section
    if(indexPath.section == 0) {
        //
        //  Load Settings
        //

        // button
        UIButton * loadButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        loadButton.frame = CGRectMake(0.0, 0.0, 300.0, 44.0);
        [loadButton setTitle:@"Load Image" forState:UIControlStateNormal];
        [loadButton setTitle:@"Load Image" forState:UIControlStateSelected];
        [loadButton addTarget:self action:@selector(loadImage:) forControlEvents:UIControlEventTouchUpInside];
        [cell.contentView addSubview:loadButton]; 


    } else if(indexPath.section == 1) {
        //
        //  Mode Settings
        //
        if(indexPath.row == 0) {
            cell.text = [mode objectAtIndex:indexPath.row];    
        } else if(indexPath.row == 1) {
            cell.text = [mode objectAtIndex:indexPath.row];    
        }


    } else if(indexPath.section == 2) {
        //
        //  Marker Settings
        //

        if(indexPath.row == 0) {
            // description text
            cell.text = [marker objectAtIndex:indexPath.row];    

            // switch
            UISwitch *markerSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
            cell.accessoryView = markerSwitch;
            [markerSwitch setOn:YES animated:NO];
            [markerSwitch addTarget:self action:@selector(markerToggle:) forControlEvents:UIControlEventValueChanged];
            [markerSwitch release];       

        } else if(indexPath.row == 1) {
            UISlider *markerGridSlider = [[UISlider alloc] initWithFrame:CGRectMake(0.0, 10.0, 284, 10.0)];
            cell.accessoryView = markerGridSlider;
            markerGridSlider.minimumValueImage = [UIImage imageNamed:@"size_icon_1x1.png"];
            markerGridSlider.maximumValueImage = [UIImage imageNamed:@"size_icon_8x8.png"];

            [markerGridSlider setMinimumValue:1.0];
            [markerGridSlider setMaximumValue:8.0];
            markerGridSlider.value = 8.0;
            [markerGridSlider addTarget:self action:@selector(markerGrid:) forControlEvents:UIControlEventValueChanged];
            [markerGridSlider release];       

        } else if(indexPath.row == 2) {
            UISlider *markerSpacingSlider = [[UISlider alloc] initWithFrame:CGRectMake(0.0, 10.0, 284, 10.0)];
            cell.accessoryView = markerSpacingSlider;
            markerSpacingSlider.minimumValueImage = [UIImage imageNamed:@"spacing_icon_min.png"];
            markerSpacingSlider.maximumValueImage = [UIImage imageNamed:@"spacing_icon_max.png"];

            [markerSpacingSlider setMinimumValue:1.0];
            [markerSpacingSlider setMaximumValue:(320.0/8.0)];
            markerSpacingSlider.value = 1.0;
            [markerSpacingSlider addTarget:self action:@selector(markerSpacing:) forControlEvents:UIControlEventValueChanged];
            [markerSpacingSlider release];       
        }
    }

    return cell;
}

спасибо.

Ken


спасибо Алону за помощь.

возможно, я не совсем понимаю, что вы имеете в виду, но я думаю, что правильно выполнил ваши предложения. Тем не менее, я все еще получаю сбой мест обмена элементов, хотя теперь после примерно 5+ ВВЕРХ и ВНИЗ, и мой UISwitch теперь находится в верхнем левом углу.

вот мой обновленный код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];



        if([indexPath section] == 0) {
            //
            // Load Settings
            //

            // button
            UIButton *loadButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] autorelease];
            loadButton.frame = CGRectMake(0.0, 0.0, 300.0, 44.0);
            [loadButton addTarget:self action:@selector(loadImage:) forControlEvents:UIControlEventTouchUpInside];
            [loadButton setTag:1000];

            [cell.contentView addSubview:loadButton]; 

        } 



        if([indexPath section] == 1) {
            //
            // Mode Settings
            //
            if([indexPath row] == 0) {
                cell.text = [mode objectAtIndex:[indexPath row]];    
            }
            if([indexPath row] == 1) {
                cell.text = [mode objectAtIndex:[indexPath row]];    
            }
        } 



        if([indexPath section] == 2) {
            //
            // Marker Settings
            //
            if([indexPath row] == 0) {
                // switch
                UISwitch *markerSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
                [markerSwitch setOn:YES animated:NO];
                [markerSwitch addTarget:self action:@selector(markerToggle:) forControlEvents:UIControlEventValueChanged];
                [markerSwitch setTag:3000];

                [cell.contentView addSubview:markerSwitch]; 
                [markerSwitch release];

            }
            if([indexPath row] == 1) {
                // slider
                UISlider *markerGridSlider = [[UISlider alloc] initWithFrame:CGRectMake(0.0, 10.0, 284, 10.0)];
                markerGridSlider.minimumValueImage = [UIImage imageNamed:@"size_icon_1x1.png"];
                markerGridSlider.maximumValueImage = [UIImage imageNamed:@"size_icon_8x8.png"];

                [markerGridSlider setMinimumValue:1.0];
                [markerGridSlider setMaximumValue:8.0];
                [markerGridSlider setValue:8.0];
                [markerGridSlider addTarget:self action:@selector(markerGrid:) forControlEvents:UIControlEventValueChanged];
                [markerGridSlider setTag:3100];

                [cell.contentView addSubview:markerGridSlider]; 
                [markerGridSlider release];

            }
            if([indexPath row] == 2) {
                // slider
                UISlider *markerSpacingSlider = [[UISlider alloc] initWithFrame:CGRectMake(0.0, 10.0, 284, 10.0)];
                markerSpacingSlider.minimumValueImage = [UIImage imageNamed:@"spacing_icon_min.png"];
                markerSpacingSlider.maximumValueImage = [UIImage imageNamed:@"spacing_icon_max.png"];

                [markerSpacingSlider setMinimumValue:1.0];
                [markerSpacingSlider setMaximumValue:(320.0/8.0)];
                [markerSpacingSlider setValue:1.0];
                [markerSpacingSlider addTarget:self action:@selector(markerSpacing:) forControlEvents:UIControlEventValueChanged];
                [markerSpacingSlider setTag:3200];

                [cell.contentView addSubview:markerSpacingSlider]; 
                [markerSpacingSlider release];

            }
        }


    } // end cell == nil


    // Load
    UIButton *loadButton = (UIButton*)[cell.contentView viewWithTag:1000];
    [loadButton setTitle:@"Load Image" forState:UIControlStateNormal];
    [loadButton setTitle:@"Load Image" forState:UIControlStateSelected];

    // Mode

    // Marker
    UISwitch *markerSwitch = (UISwitch*)[cell.contentView viewWithTag:3000];
    UISlider *markerGridSlider = (UISlider*)[cell.contentView viewWithTag:3100];
    UISlider *markerSpacingSlider = (UISlider*)[cell.contentView viewWithTag:3200];


    return cell;
}

Ответы [ 2 ]

1 голос
/ 31 марта 2012

изменение статический NSString * CellIdentifier = @ "Cell"; для каждого раздела, например:

NSString * CellIdentifier;if (indexPath.section == 0) {CellIdentifier = @ "Cell";} elseif (indexPath.section == 2) {CellIdentifier = @ "Cell2";}

1 голос
/ 26 октября 2011

Все ячейки, связанные с UITable в iOS, для повторного использования . вот почему вы сначала получаете свою ячейку с вызовом функции "dequeueReusableCellWithIdentifier", ячейка может не быть nil, указывая на ячейку, которая была загружена ранее. в вашем случае, даже если ячейка не ноль, вы добавляете подпредставления к ней. это будет происходить бесконечно много раз при прокрутке вверх и вниз.

Вот небольшой пример:

-(int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 2;
}

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

    const NSInteger lblTag = 101;
    const NSInteger btnTag = 102;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    //First init the cells
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        //Initialize subviews of cells only in this block.

        if (indexPath.row == 0) {
            //Only the first cell on the top has a UILabel
            UILabel *lbl = [[[UILabel alloc] initWithFrame:CGRectMake(5, 5, 100, 20)] autorelease];
            lbl.tag = lblTag;    
            [cell.contentView addSubview:lbl];
        } else if (indexPath.row == 1) {
            //Only the 2nd cell has a UIButton
            UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            btn.frame = CGRectMake(5, 5, 60, 20);
            btn.tag = btnTag;    
            [cell.contentView addSubview:btn];
        }
    }

    //Modify your cells here
    if (indexPath.row == 0) {
        //Only the first cell on the top has a UILabel
        UILabel *lbl = (UILabel*)[cell.contentView viewWithTag:lblTag];
        //Do stuff with our label

        lbl.text = [NSString stringWithFormat:@"%d",indexPath.row];

    } else if (indexPath.row == 1) {
        //Only the 2nd cell has a UIButton
        UIButton *btn = (UIButton*)[cell.contentView viewWithTag:btnTag];
        //Do stuff with our button
        [btn setTitle:[NSString stringWithFormat:@"%d",indexPath.row] forState:UIControlStateNormal];

    }

    return cell;

}

В вашем очень конкретном случае вы бы написали это -

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    if (section == 0) {
        return 1;
    } else if (section == 1) {
        return 2;
    } else if (section == 2) {
        return 3;
    } else {
        return 0;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";



    const NSInteger
    sec0BtnTag = 101,
    markerSwitchTag = 102,
    markerGridSliderTag = 103,
    markerSpacingSliderTag = 104;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];



        if([indexPath section] == 0) {
            //
            // Load Settings
            //

            // button
            UIButton *loadButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] autorelease];
            loadButton.frame = CGRectMake(0.0, 0.0, 300.0, 44.0);
            [loadButton addTarget:self action:@selector(loadImage:) forControlEvents:UIControlEventTouchUpInside];
            [loadButton setTag:sec0BtnTag];

            [cell.contentView addSubview:loadButton]; 

        } 



        else if([indexPath section] == 2) {
            //
            // Marker Settings
            //
            if([indexPath row] == 0) {
                // switch
                UISwitch *markerSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
                [markerSwitch setOn:YES animated:NO];
                [markerSwitch addTarget:self action:@selector(markerToggle:) forControlEvents:UIControlEventValueChanged];
                [markerSwitch setTag:markerSwitchTag];

                [cell.contentView addSubview:markerSwitch]; 
                [markerSwitch release];

            }
            else if([indexPath row] == 1) {
                // slider
                UISlider *markerGridSlider = [[UISlider alloc] initWithFrame:CGRectMake(0.0, 10.0, 284, 10.0)];
                markerGridSlider.minimumValueImage = [UIImage imageNamed:@"size_icon_1x1.png"];
                markerGridSlider.maximumValueImage = [UIImage imageNamed:@"size_icon_8x8.png"];

                [markerGridSlider setMinimumValue:1.0];
                [markerGridSlider setMaximumValue:8.0];
                [markerGridSlider setValue:8.0];
                [markerGridSlider addTarget:self action:@selector(markerGrid:) forControlEvents:UIControlEventValueChanged];
                [markerGridSlider setTag:markerGridSliderTag];

                [cell.contentView addSubview:markerGridSlider]; 
                [markerGridSlider release];

            }
            else if([indexPath row] == 2) {
                // slider
                UISlider *markerSpacingSlider = [[UISlider alloc] initWithFrame:CGRectMake(0.0, 10.0, 284, 10.0)];
                markerSpacingSlider.minimumValueImage = [UIImage imageNamed:@"spacing_icon_min.png"];
                markerSpacingSlider.maximumValueImage = [UIImage imageNamed:@"spacing_icon_max.png"];

                [markerSpacingSlider setMinimumValue:1.0];
                [markerSpacingSlider setMaximumValue:(320.0/8.0)];
                [markerSpacingSlider setValue:1.0];
                [markerSpacingSlider addTarget:self action:@selector(markerSpacing:) forControlEvents:UIControlEventValueChanged];
                [markerSpacingSlider setTag:markerSpacingSliderTag];

                [cell.contentView addSubview:markerSpacingSlider]; 
                [markerSpacingSlider release];

            }
        }


    } // end cell == nil

    //Load specific cell row values

    if([indexPath section] == 0) {
        //
        // Load Settings
        //

        // button
        UIButton *loadButton = (UIButton*)[cell.contentView viewWithTag:sec0BtnTag];
        [loadButton setTitle:@"Load Image" forState:UIControlStateNormal];
        [loadButton setTitle:@"Load Image" forState:UIControlStateSelected];
        //do other stuff with the button here according to the specific row & section

    } 



    if([indexPath section] == 1) {
        //
        // Mode Settings
        //
        if([indexPath row] == 0) {
            cell.text = [mode objectAtIndex:[indexPath row]];    
        }
        if([indexPath row] == 1) {
            cell.text = [mode objectAtIndex:[indexPath row]];    
        }
    } 



    if([indexPath section] == 2) {
        //
        // Marker Settings
        //
        if([indexPath row] == 0) {
            // switch
            UISwitch *markerSwitch = (UISwitch*)[cell.contentView viewWithTag:markerSwitchTag];
            //do stuff with the switch here according to the specific row & section
        }
        if([indexPath row] == 1) {
            // slider
            UISlider *markerGridSlider = (UISlider*)[cell.contentView viewWithTag:markerGridSliderTag];
            //do stuff with the slider here according to the specific row & section
        }
        if([indexPath row] == 2) {
            // slider
            UISlider *markerSpacingSlider = (UISlider*)[cell.contentView viewWithTag:markerSpacingSliderTag];
            //do stuff with the slider here according to the specific row & section



        }
    }


    return cell;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...