1

我搜索了论坛,但没有找到适合我情况的任何内容。我还是新手,所以这可能很简单,但我似乎无法弄清楚。

我有一个 UITableViewController 有几个部分。我创建了一个名为 SSSDataEntryCell 的自定义类,它允许用户输入文本。但是,在其中一个单元格中,我想用 UISegmentedControl 替换它。该代码在第一次显示表格时工作(控件出现,我可以选择一个段并且值更改),但是在任何类型的重新加载事件(旋转,滚动单元格不可见等)上,分段控制不再出现。

我每次都需要重新创建分段控件吗?这似乎效率低下,特别是因为它是一个 ivar。我曾尝试在添加之前发布单元格的子视图以及有关 stackoverflow 的许多其他建议,但似乎没有任何解决方法。提前致谢!

这是我的 .h 的相关部分

@interface SSSEditDetailViewController : UITableViewController <UITextFieldDelegate>
{
    // lets us set the sex (male, female)
    UISegmentedControl *sexSwitch;
}

这是.m的相关部分

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Load the NIB file for our custom cell
    UINib *nib = [UINib nibWithNibName:@"SSSDataEntryTableCell" bundle:nil] ;

    // Register the NIB which contains the cell
    [[self tableView] registerNib:nib forCellReuseIdentifier:@"SSSDataEntryTableCell"] ;

    //
    // set up the sex switch if needed
    //
    if ( sexSwitch == nil )
    {
        NSArray *values = [[NSArray alloc] initWithObjects:kSSSMale, kSSSFemale, nil] ;
        sexSwitch = [[UISegmentedControl alloc] initWithItems:values] ;
        [sexSwitch addTarget:self action:@selector(changeSex:)  
                  forControlEvents:UIControlEventValueChanged] ;
        [sexSwitch setSegmentedControlStyle:UISegmentedControlStyleBar] ;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    SSSDataEntryTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SSSDataEntryTableCell"] ;

    if ( [indexPath section] == 0 )
    {
        [[cell dataField] setDelegate:self] ;
        [[cell dataField] setOurPath:indexPath] ;

        [[cell dataField] setText:[person name]] ;
        [[cell dataField] setPlaceholder:@"Name"] ;
    }
    else if ( [indexPath section] == 1 )
    {
        // Sex switch;
        [cell setAccessoryType:UITableViewCellAccessoryNone] ;

        // get cell frame and put the sex switch in its place
        [sexSwitch setFrame:[cell frame]] ;
        [sexSwitch setAutoresizingMask:UIViewAutoresizingFlexibleWidth] ;

        [[cell contentView] addSubview:sexSwitch] ;
    }

    return cell ;
}
4

1 回答 1

1

您的主要问题是使用单元格的框架来设置开关的框架。如果您记录 cell.frame,您有时会在上下滚动时看到它的 y 值很大,因此有时您的开关不在屏幕底部。这很容易解决,使用边界而不是框架。

您还有另一个问题,因为当单元被重复使用时,开关可能会出现在不应该出现的其他单元上。如果要在代码中添加开关,则需要在执行 if 语句之前将其删除,以便从原始单元格开始。一种方法是给开关一个标签,然后删除带有该标签的视图:

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

        SSSDataEntryTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SSSDataEntryTableCell"] ;
        [[cell.contentView viewWithTag:47] removeFromSuperview];
        [[cell dataField] setText:nil];
        [[cell dataField] setPlaceholder:@"Name"] ;

        if ( [indexPath section] == 0 )
        {
            [[cell dataField] setDelegate:self] ;
            [[cell dataField] setOurPath:indexPath] ;

            [[cell dataField] setText:[person name]] ;
        }
        else if ( [indexPath section] == 1 )
        {
            // Sex switch;
            [cell setAccessoryType:UITableViewCellAccessoryNone] ;
            // get cell frame and put the sex switch in its place
            [sexSwitch setFrame:[cell bounds]];
            [sexSwitch setAutoresizingMask:UIViewAutoresizingFlexibleWidth] ;
            sexSwitch.tag = 47;
            [[cell contentView] addSubview:sexSwitch] ;
        }
        return cell ;
    }

我不确定你在用占位符做什么,但你可能想在 if 语句之前将它上移,并将文本设置为 nil ,以便它也恢复到初始状态。

于 2013-06-02T04:14:19.297 回答