如何从单独的IBAction中检测UISegmentedControl中的更改

时间:2012-12-31 10:41:48

标签: objective-c ios uisegmentedcontrol

我有一个包含三个细分的UISegmentedControl按钮。 在ViewController.m中,这工作得很好 - 按下按钮会触发正确的方法。

我有另一个单独的UIButton,当它被按下时,它需要首先检查UISegmentedControl的状态(查看当前按下的按钮),然后根据该段值触发方法

以下是我单独UIButton的代码。按钮本身正在工作,但我似乎无法弄清楚如何获取UISegmentedControl段的当前值。

非常感谢这里的任何帮助。 我是OBJ-C的新手。我知道如何在VisualBasic中执行此操作,因此我会非常感谢更详细的答案,因为我需要了解“为什么'”。谢谢。

- (IBAction)decodeButton:(id)sender {
    UISegmentedControl *segment = [UISegmentedControl alloc];  // THIS DOES NOT WORK.

    if (segment.selectedSegmentIndex == 0) {
                decode(textToDecode);
    } else if(segment.selectedSegmentIndex == 1) {
                decode1(textToDecode);
    } else if(segment.selectedSegmentIndex == 2) {
                decode2(textToDecode); 
    }
}

5 个答案:

答案 0 :(得分:18)

Here是一个教程using UISegmentedControl in iOS.

只需创建一个参考对象并将其正确连接到文件所有者。

IBOutlet UISegmentedControl *segmentedControl;

然后设置属性

@property (strong, nonatomic) IBOutlet UISegmentedControl * segmentedControl;

.m文件中的合成

@synthesize segmentedControl;

现在您可以随时访问所选索引。

- (IBAction)decodeButton:(id)sender {

    if (segmentedControl.selectedSegmentIndex == 0) {
                decode(textToDecode);
    } else if(segmentedControl.selectedSegmentIndex == 1) {
                decode1(textToDecode);
    } else if(segmentedControl.selectedSegmentIndex == 2) {
                decode2(textToDecode); 
    }
}

答案 1 :(得分:5)

每次alloc按钮按下操作时,

您的代码UISegmentedControl。因此,请使用以下代码创建sUISegmentedControl及其操作。

 SegmentChangeView=[[UISegmentedControl alloc]initWithItems:[NSArray arrayWithObjects:@"Segment1",@"Segment2",@"Segment3",nil]];
    SegmentChangeView.frame=CGRectMake(5, 44, self.view.bounds.size.width-10, 33);
    SegmentChangeView.selectedSegmentIndex=0;
    SegmentChangeView.segmentedControlStyle=UISegmentedControlStyleBar;
    SegmentChangeView.momentary = YES;
    [SegmentChangeView setTintColor:[UIColor blackColor]];
    NSDictionary *attributes =[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"Arial" size:13],UITextAttributeFont,nil];
    [SegmentChangeView setTitleTextAttributes:attributes forState:UIControlStateNormal];
    [SegmentChangeView addTarget:self action:@selector(SegmentChangeViewValueChanged:) forControlEvents:UIControlEventValueChanged];
    SegmentChangeView.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleBottomMargin;
    [self.view addSubview:SegmentChangeView];

-(IBAction)SegmentChangeViewValueChanged:(UISegmentedControl *)SControl
{
    if (SControl.selectedSegmentIndex==0)
    {
          decode(textToDecode);
    }
    else if (SControl.selectedSegmentIndex==1)
    {
            decode1(textToDecode);
    }
else if (SControl.selectedSegmentIndex==2)
    {
            decode2(textToDecode);
    }


}

答案 2 :(得分:3)

您应该从代码中删除UISegmentedControl *segment = [UISegmentedControl alloc] ;,因为它每次都会分配一个新的UISegmentedControl实例,而不是

为您创建一个出口UISegmentController,如

@property (strong, nonatomic) IBOutlet UISegmentedControl * segment;

然后在viewcontroller.m文件中的任何位置,您都可以使用

获取当前选定的细分
segment.selectedSegmentIndex;

希望这有意义,

此致

答案 3 :(得分:1)

此代码表示您每次点击都会创建一个新对象

 UISegmentedControl *segment = [UISegmentedControl alloc] ;

你需要做的事情就是IBOutlet segmentedControl(属性)然后我会为你工作。不要在按钮方法中创建新对象。当您创建IBOutlet时,它将与segmentControl链接,您的代码将在那个时间工作。感谢

答案 4 :(得分:1)

试试这个

- (IBAction)segmentedControlChanged:(id)sender
{
   UISegmentedControl *s = (UISegmentedControl *)sender;

   if (s.selectedSegmentIndex == 1)
   {
      //code
   }
   else
   {
      //code
   }
}