【问题标题】:Getting access to a UISegementedControl in Swift在 Swift 中访问 UISegementedControl
【发布时间】:2014-09-16 11:44:13
【问题描述】:

我一直在使用 UISegmentedControl 并希望根据需要对其进行管理。我在故事板上创建了它,连接了出口和动作。它可以很好地可视化,并且操作 indexchanged 上的回调有效。我想在可视化之前对此进行一些其他管理,所以我被困在如何正确访问我在情节提要中设置的 mysegmentedControl 上。似乎是一个愚蠢的问题,但我找不到当前可以涉及的 UISegmentedControl 的 Swift 示例。

class ViewController: UIViewController, MKMapViewDelegate {
    ...
    //playing around with a Segmented Control
    @IBOutlet var mysegmentedControl : UISegmentedControl

    // Any time the button is clicked in the Segmented Control the index changes so we catch it to do something.

    @IBAction func indexChanged(sender : UISegmentedControl) {
        // This all works fine and it prints out the value of 3 on any click 
        println("# of Segments = \(sender.numberOfSegments)")

        switch sender.selectedSegmentIndex {
        case 0:
            println("first segement clicked")
        case 1:
            println("second segment clicked")
        case 2:
            println("third segemnet clicked")
        default:
            break;
        }  //Switch
    } // indexChanged for the Segmented Control

    override func viewDidLoad() {
        super.viewDidLoad()

         //  1.  How do I get proper access to the mysegmentedControl that was created in the storyboard and is already displayed.
         //      The indexChanged function gets called fine on the display via sender getting passed to it.
         //      I equate this to getting the pointer to it in C so I leverage it elsewhere
         //  2.  Guessing I don't need to init a new UISegmentedControl or do I?

         // This compiles but crashes on run with: fatal error: Can't unwrap 
         println("# of Segments = \(mysegmentedControl.numberOfSegments)")

    } // viewDidLoad    

} // ViewController

【问题讨论】:

    标签: ios swift uisegmentedcontrol


    【解决方案1】:

    我能够成功编译和运行您的代码。您的问题不是您的分段 ctrl,可能您的可选对象之一是 nil,因此您无法打开它。看看你的可选对象。

    另外,试试 @IBOutlet var mysegmentedControl : UISegmentedControl?

    这绝对可以解决您的问题

    【讨论】:

    • 我不确定您所说的可选对象是什么意思,但它确实为零,因为我现在对其进行了检查,所以问题仍然是如何访问正在使用的 UISegmentedControl。
    • mysegmentedControl 在 vi​​ewDiDLoad 中绝对为零,因为我围绕它进行了一些检查。这是问题的核心,因为我不知道如何处理它,因为我没有启动它并且正在利用插座。我不能使用你的语法,因为属性不可用,比如 numberOfSegments
    【解决方案2】:

    这是我用过的,对我来说很好用 -

    @IBOutlet var mysegmentedControl : UISegmentedControl?
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func indexChanged(sender : UISegmentedControl) {
        // This all works fine and it prints out the value of 3 on any click
        println("# of Segments = \(sender.numberOfSegments)")
    
        switch sender.selectedSegmentIndex {
        case 0:
            println("first segement clicked")
        case 1:
            println("second segment clicked")
        case 2:
            println("third segemnet clicked")
        default:
            break;
        }  //Switch
    } // indexChanged for the Segmented Control
    
    override func viewDidLoad() {
        super.viewDidLoad()
        println("# of Segments = \(mysegmentedControl?.numberOfSegments)")
    
    }
    

    【讨论】:

    • ok..tks 用于运行代码。由于它在您的环境中工作,而不是在我的环境中工作,所以我回到情节提要并发现一个未配置的插座,所以一旦我处理好它,我就可以访问 mysegementedControl(它不再是 nil)。我希望 Xcode 能以某种方式捕捉这些情况,因为我之前曾因 Storyboard 错误配置而被捕捉到,而且整理它们有点乏味。感谢您的帮助。
    【解决方案3】:

    这就是应如何声明 IBOutlet。事实上,Xcode 6 Beta 4 会自动为所有 IBOutlets 执行此操作。这 !将变量标记为隐式展开的可选:

    @IBOutlet var mysegmentedControl : UISegmentedControl!

    https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Types.html

    阅读“隐式展开的可选类型”部分。

    【讨论】:

    • Tks Shan - 我必须有一个旧版本...版本 6.0 (6A215l)。我添加了!并且编译没有问题。
    【解决方案4】:

    请找到以下代码 sn-p 用于使用 swift 访问 uisegmentedcontrol。

       @IBOutlet weak var segmentedControl: UISegmentedControl!
    
        @IBOutlet weak var textLabel: UILabel!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            textLabel.text = "First Segment Selected";
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    
        @IBAction func segmentedControlAction(sender: AnyObject) {
    
            if(segmentedControl.selectedSegmentIndex == 0)
            {
                textLabel.text = "First Segment Selected";
            }
            else if(segmentedControl.selectedSegmentIndex == 1)
            {
                textLabel.text = "Second Segment Selected";
            }
            else if(segmentedControl.selectedSegmentIndex == 2)
            {
                textLabel.text = "Third Segment Selected";
            }
        }
    

    如果需要详细说明,请参考以下链接。

    http://sourcefreeze.com/uisegmentedcontrol-example-using-swift-in-ios/

    【讨论】:

    • 请考虑使用switch而不是if else if else if
    猜你喜欢
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多