UISegmentedControl编程更改段数

86

有没有一种方法可以通过编程来更改段数?

8个回答

142

是的,你可以使用

removeSegmentAtIndex:(NSUInteger) animated:(BOOL)

并且

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

我用以下代码解决了问题: [self.SegmentAnswer insertSegmentWithTitle:@"5" atIndex:4 animated:YES]; [self.SegmentAnswer insertSegmentWithTitle:@"6" atIndex:5] - Beppino66

50

要完全替换段落,你可以使用以下函数:

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

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

希望这能帮到你。


3
非常适合放入 UISegmentedControl 类别中。谢谢! - DonnaLea
1
你可以使用 [segmentController removeAllSegments] 替代 while 循环。请参阅文档 https://developer.apple.com/library/ios/documentation/UIKit/Reference/UISegmentedControl_Class/#//apple_ref/occ/instm/UISegmentedControl/removeAllSegments。 - MCR
请再确认一下,这个可用于7.X和8.X的版本,对吧? - Zorayr
根据@MCR的评论,编辑为使用[segmentController removeAllSegments] - Zorayr

37

这里是一个小的Swift扩展,可以用一组新值替换当前的分段控件。

Swift 3

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

Swift 4

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

5
这里是用于将段落替换为字符串序列的Swift扩展。它类似于此处提供的另一个答案,除了它可以与任何序列一起使用,这意味着您还可以传递切片、集合等。
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)
        }
    }
}

1
你能否添加一个链接,指向你所参考的另一个答案?在其下方点击“分享”链接,即可获得该答案的永久链接。 - Al Sweigart

3

为了完整起见(以及我在搜索如何在xib中实现同样功能时来到这里),以下是如何在xib中完成此操作:

输入图像描述


2
比你想象的更简单: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
    }

0

对我有用,UIsegmentedControl 包含两个段,我想在索引 2 中添加一个,使用此代码在 Swift 2.2 中使用:

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

0

使用代码在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)
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接