简体   繁体   English

UISegmentedControl 以编程方式更改段数

[英]UISegmentedControl change number of segments programmatically

Is there a way to change the number of segments programmatically?有没有办法以编程方式更改段数?

Yes, you can use是的,你可以使用

removeSegmentAtIndex:(NSUInteger) animated:(BOOL)

And

insertSegmentWithTitle:(NSString *) atIndex:(NSUInteger) animated:(BOOL)

To replace the segments entirely, you can use the following function:要完全替换段,您可以使用以下函数:

- (void)setSegments:(NSArray *)segments
{
    [segmentController removeAllSegments];

    for (NSString *segment in segments) {
        [segmentController insertSegmentWithTitle:segment atIndex:segmentController.numberOfSegments animated:NO];
    }
}

Hope this helps.希望这可以帮助。

And here's a little Swift extension to replace current segmentedControl with array of new values这里有一个小的 Swift 扩展,用新值数组替换当前的 segmentedControl

Swift 3斯威夫特 3

extension UISegmentedControl {
    func replaceSegments(segments: Array<String>) {
        self.removeAllSegments()
        for segment in segments {
            self.insertSegmentWithTitle(segment, atIndex: self.numberOfSegments, animated: false)
        }
    }
}

Swift 4斯威夫特 4

extension UISegmentedControl {
    func replaceSegments(segments: Array<String>) {
        self.removeAllSegments()
        for segment in segments {
            self.insertSegment(withTitle: segment, at: self.numberOfSegments, animated: false)
        }
    }
}

Here is a Swift extension for replacing the segments with a sequence of strings.这是一个用字符串序列替换段的 Swift 扩展。 It's similar to another answer given here except it can be used with any sequence, meaning you can also pass in slices, sets, etc.它类似于此处给出的另一个答案,除了它可以与任何序列一起使用,这意味着您还可以传入切片、集合等。

extension UISegmentedControl {

    /// Replace the current segments with new ones using a given sequence of string.
    /// - parameter withTitles:     The titles for the new segments.
    public func replaceSegments<T: Sequence>(withTitles: T) where T.Iterator.Element == String {
        removeAllSegments()
        for title in withTitles {
            insertSegment(withTitle: title, at: numberOfSegments, animated: false)
        }
    }
}

For the sake of completeness (and because I ended up here looking for how to achieve the same thing in xib) here is how to do it in xib:为了完整起见(并且因为我最终在这里寻找如何在 xib 中实现同样的事情)这里是如何在 xib 中做到这一点:

在此处输入图像描述

work for me, UIsegmentedControll contains two segments, i want add one in index 2, use this code in swift 2.2 use:为我工作,UIsegmentedControll 包含两个段,我想在索引 2 中添加一个,在 swift 2.2 中使用此代码使用:

SEG_TipoFiltro.insertSegmentWithTitle("Title", atIndex: 2, animated: false)

adding and deleting segments in swift4 using code使用代码在 swift4 中添加和删除段

class ViewController: UIViewController {

  @IBOutlet weak var segment1: UISegmentedControl!

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
  }

  @IBAction func insert(_ sender: Any) {  
    segment1.insertSegment(withTitle: "\(segment1.numberOfSegments+1)", at: segment1.numberOfSegments, animated: true)  
  }

  @IBAction func remove(_ sender: Any) {  
    segment1.removeSegment(at: segment1.numberOfSegments-1, animated: true)
  }
}

Simple than u think: Swift 5.7比你想象的简单:Swift 5.7

func setSegmentedControl() {
        // [1] remove all segments
        segmentedControl.removeAllSegments()

        // [2] insert your segments by your model
        ["title1", "title2", "title3"].enumerated().forEach { index, title in
            segmentedControl.insertSegment(withTitle: title, at: index, animated: false)
        }
    
        // [3] optional - select default segment
        segmentedControl.selectedSegmentIndex = 0
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM