【问题标题】:UISegmentedControl writing text labels problemUISegmentedControl 写入文本标签问题
【发布时间】:2011-08-18 15:08:07
【问题描述】:

晚安,

这段代码有以下问题:

-(void)textpopup:(UISegmentedControl *)sender {

    int nummer = sender.tag;

    if (sender.tag) {
       if(sender.selectedSegmentIndex == 0 || sender.selectedSegmentIndex == 1){
           beoordeling = [[UITextField alloc] init];
           beoordeling.frame = CGRectMake(50 , nummer * 117 + 275 , scrollView.frame.size.width - 100 , 35);
           beoordeling.autoresizingMask = (UIViewAutoresizingFlexibleWidth);
           beoordeling.borderStyle = UITextBorderStyleLine;
           beoordeling.tag = nummer;
           [scrollView addSubview:beoordeling];


       }
        if(sender.selectedSegmentIndex == 2 || sender.selectedSegmentIndex == 3){
            if (beoordeling.tag == sender.tag) {
                [beoordeling removeFromSuperview];
            }
        }

    }
}

我将解释这个场景。我得到了一些动态的 UISegmentedControls。目前有12个。在选择的前 2 个段中,需要弹出一个文本字段。这进展顺利。但是在选择前 2 段一段时间后,当我转到第 2 段和第 3 段时,有时文本字段不会删除。

我希望当我推送段 0 和 1 时写入的文本字段在推送段 2 和 3 时被删除。

我错过了什么吗?

编辑: 一开始我想说,我从来不知道我得到了多少 UITextFields。 When segments 0 and 1 are chosen, a UITextField needs to popup to that corresponding UISegmentedControl. And when segments 2 and 3 are chosen, the UITextField needs to stay away.但我现在通过以下方式解决了这个问题。

-(void)textpopup:(UISegmentedControl *)sender {

    int nummer = sender.tag;


       if(sender.selectedSegmentIndex == 0 || sender.selectedSegmentIndex == 1){

           // Before i add a new UITextField, the old one has to be removed.
           UITextField *text = (UITextField *)[beoordeling viewWithTag:sender.tag];
           [text removeFromSuperView];   

           beoordeling = [[UITextField alloc] init];
           beoordeling.frame = CGRectMake(50 , nummer * 117 + 275 , scrollView.frame.size.width - 100 , 35);
           beoordeling.autoresizingMask = (UIViewAutoresizingFlexibleWidth);
           beoordeling.borderStyle = UITextBorderStyleLine;
           beoordeling.tag = nummer;
           [scrollView addSubview:beoordeling];


       }
        else if(sender.selectedSegmentIndex == 2 || sender.selectedSegmentIndex == 3) {

            UITextField *tf = (UITextField *)[beoordeling viewWithTag:sender.tag];
            tf.text = nil;
            [tf removeFromSuperview];

        }


    }

【问题讨论】:

    标签: objective-c uisegmentedcontrol


    【解决方案1】:

    第二个if 应该是else if,因为只有在第一个没有的情况下才会执行(所选索引不能同时为 0 和 2)。

    您想要做什么取决于您如何定义beoordeling。我建议将其作为实例变量,甚至可能是IBOutlet。在您班级的dealloc 中发布。然后,在第一个if 子句中,写

    if (!beoordeling) {
        beoordeling = [[UITextField alloc] init];
        // Other setup
    }
    [scrollView addSubview:beoordeling];
    

    我不太明白你为什么要检查标签,但要在第二个if 中删除,只需调用removeFromSubview

    所有分段控件都调用相同的行为吗?如果您只有一个要设置标签的beorrdeling,那么您无需费心检查标签。只需使用removeFromSubview 添加/删除它。如果您拥有与分段控件一样多的文本字段,那么 KVC 可能就是您想要的。如果分段控件的标签从 0 到 11,您可能有 beoordeling0beoordeling1beoordeling2 等。然后,要获得您想要的,请使用以下内容:

    beoordeling = (UITextField *)[self valueForKey:[NSString stringWithFormat:@"beoordeling%d", sender.tag]];
    

    【讨论】:

      【解决方案2】:

      不太确定你想在这里实现什么,但你确实需要释放你的 UITextField 对象 beoordeling 否则你会泄漏。 AddSubview 将保留计数加一,因此立即释放应该是安全的:

      [scrollView addSubview:beoordeling];
      [beoordeling release];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-15
        • 2012-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多