UITableView 多个部分,带有 GUI 元素 UIButton、UISwitch 等 [英] UITableView multiple sections with GUI Elements UIButton, UISwitch, etc

查看:44
本文介绍了UITableView 多个部分,带有 GUI 元素 UIButton、UISwitch 等的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在这个问题上绞尽脑汁一天左右了...我已经搜索了这个论坛以及谷歌和其他博客等,但都无济于事.

I have been racking my brain on this problem for a day or so now... I've searched this forum as well as google and other blogs etc. All to no avail.

我正在做的是创建一个具有多个部分的 UITableView,并且在每个部分中,每一行都有一个不同的 GUI 元素(即设置屏幕)

What i'm doing is creating a UITableView with multiple sections and within each section, each row has a different GUI element (i.e. a settings screen)

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

我希望实现的目标是每个部分在不同的单元格中都有不同的 GUI 元素.但是正如您在此屏幕截图中看到的:

and all I'm looking to achieve is that each section to have various GUI elements in various cells. BUT as you can see in this screenshot:

最初一切都看起来应该如此,但是在向上和向下滚动一次后,问题就开始了.元素开始四处移动,向上和向下滚动越多/时间越长,元素移动得越多.

Initially everything appears as it should, but after scrolling UP and DOWN once, the problems begin. Elements begin to shuffle around and the more/longer you scroll UP and DOWN the more the elements move around.

!["UITableView 在部分和行中带有 GUI 元素.错误?故障?无知?"][2]

!["UITableView with GUI elements in sections and rows. Bug? Glitch? Ignorance?"][2]

这是一个错误吗?毛刺?还是无知?(可能是后者) - 除了 GUI 代码之外,我已经删除了所有其他代码,如果这意味着什么,我正在使用 NIB 来创建 UITableView

Is this a bug? glitch? or ignorance? (probably the latter) - I've stripped out all other code except for the GUI code and if it means anything I'm creating the UITableView using a NIB

此外,这是我的 cellForRowAtIndexPath 方法的代码.如果有人能指出我正确的方向或告诉我我做错了什么,我将永远感激不尽.

Also, here's the code for my cellForRowAtIndexPath method. I will be eternally grateful if someone could point me in the right direction or tell me what i'm doing wrong.

- (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;
}

谢谢.

谢谢你的帮助.

也许我没有完全理解你的意思,但我想我已经正确地实施了你的建议.但是我仍然遇到元素交换位置的故障,尽管现在经过大约 5 次以上的向上和向下滑动,我的 UISwitch 现在位于左上角.

maybe i'm not understanding exactly what you mean, but i think i've implemented your suggestions properply. however i still get the glitch of the elements swapping places although now after about 5+ UP and DOWN swipes and my UISwitch is now placed in the top left corner.

这是我更新的代码:

- (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;
}

推荐答案

change static NSString *CellIdentifier = @"Cell"; 像:

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

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

这篇关于UITableView 多个部分,带有 GUI 元素 UIButton、UISwitch 等的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆