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
これが私が使ったもので、私にとってはうまく機能しています-
@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)")
}
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/
これは、IBOutletを宣言する方法です。実際、Xcode 6 Beta 4は、すべてのIBOutletsに対してこれを自動的に実行します。 !!変数を暗黙的にアンラップされたオプションとしてマークします。
@IBOutlet var mysegmentedControl : UISegmentedControl!
「暗黙的にアンラップされたオプションタイプ」セクションをお読みください。
コードを正常にコンパイルして実行することができます。問題はセグメント化されたCtrlキーではありません。おそらく、オプションのオブジェクトの1つがnilであるため、ラップを解除できません。オプションのオブジェクトを見てください。
また、@ IBOutlet var mysegmentedControl:UISegmentedControl?を試してください。
これは間違いなくあなたの問題を解決するはずです