web-dev-qa-db-ja.com

Swift)でUISegmentedControlにアクセスする

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
10
Kokanee

これが私が使ったもので、私にとってはうまく機能しています-

@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)")

}
14
Avi

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/

1

これは、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

「暗黙的にアンラップされたオプションタイプ」セクションをお読みください。

0
Shan

コードを正常にコンパイルして実行することができます。問題はセグメント化されたCtrlキーではありません。おそらく、オプションのオブジェクトの1つがnilであるため、ラップを解除できません。オプションのオブジェクトを見てください。

また、@ IBOutlet var mysegmentedControl:UISegmentedControl?を試してください。

これは間違いなくあなたの問題を解決するはずです

0
Avi