【问题标题】:IOS Segmented Control: Can't Change Selected SegmentIOS分段控制:不能改变选定的段
【发布时间】:2017-07-12 22:55:27
【问题描述】:

我在情节提要中创建了一个分段控件,如下所示:

然后我为控件的值更改时创建了一个 IBAction:

@IBAction func segmentValChanged(_ sender: UISegmentedControl) {
    print("touched")
    if (sender.selectedSegmentIndex == 0) {
        sender.selectedSegmentIndex = 1;
    }
    else{
        sender.selectedSegmentIndex = 0;
    }
}

唯一的问题是这个函数永远不会被调用! 当我点击 Jokes (Beta) 按钮时,什么也没有发生。

但是,当我为控件创建一个 IBOutlet 并尝试更改我的 viewDidLoad() 中的选定段时,它起作用了:

segmentedController.selectedSegmentIndex = 1

我知道我可能错过了一些明显的东西,因为我以前从未使用过分段控件。 如果有人能指出这是什么,非常感谢。 干杯!

import UIKit
import Alamofire

class ViewController: UIViewController {

    var currentImage: CurrentImage!

    var parameters: Parameters!

    @IBOutlet weak var segmentedController: UISegmentedControl!


    @IBAction func segmentValChanged(_ sender: UISegmentedControl) {
        print("touched")
        if (sender.selectedSegmentIndex == 0) { // switch to 1
            sender.selectedSegmentIndex = 1;
        }
        else{
            sender.selectedSegmentIndex = 0;
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        segmentedController.selectedSegmentIndex = 1
        self.segmentedController.addTarget(self, action: #selector(segmentValChanged(_:)), for: .valueChanged)
    }
}

这就是我右键单击视图时的样子:

【问题讨论】:

  • 您是否将 IB 中的这个函数绑定.valueChanged
  • 是的,我做到了
  • cosole 正在打印“touched”消息?
  • 澄清一下:触摸的消息没有被打印出来
  • 尝试以编程方式添加操作,尝试在您的 viewDidLoad self.segmentedControl.addTarget(self, action: #selector(change), for: .valueChanged)

标签: ios swift uisegmentedcontrol


【解决方案1】:

每当我看到这一点时,它几乎总是同样的问题...如果分段控件被绘制在其父视图的外部,那么它将不会响应点击。这很可能是您遇到的问题。 (这也可能发生在 UIButtons 上。)

测试这是否是问题的方法:

  1. 将分段控件父级的clipsToBounds 设置为true。如果控件不再显示在屏幕上,则它是在其父视图之外绘制的。 segmentedControl.superview?.clipsToBounds = true

  2. 为分段控件的父级添加边框。如果控件被绘制在边界之外,那么你就可以了。 segmentedControl.superview?.layer.borderWidth = 1

通过扩展父视图的大小来解决问题,以便在其中绘制控件。


附带说明,您的 IBAction 不正确。当调用值更改操作时,分段控件已经更改了它的值,并且新的分段将突出显示。您不必手动操作。这是另一个指标,表明您的控件未在其父视图的边界内绘制。

【讨论】:

  • 非常感谢先生。这个答案非常有效。
  • 我刚刚遇到了同样的问题。我添加了 Daniel T. 建议的两行,但它仍然没有响应..
  • 另一种可能性是 superView 层次结构中的一个视图将其 isUserInteractionEnabled 设置为 false。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 2020-01-30
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多