目的:
読み込むデータの種類によってどうしてもSegmentedControlの数をかえたかったので方法をいろいろ調べてきました。もっと簡単な方法があったら教えてください
方法:
①セグメントに表示するwordをあらかじめ準備する
あらかじめ表示するセグメントtitleを入れておくArrayを準備しておきます。今回は以下のようなArrayを準備しました。
let floorTags:[String] = ["B1F","1F","2F","3F","4F/5F"]
私が開発しているアプリ上、文字列で準備していますが、数字でも問題ないです。ただtitleはStringにする必要があるのでどこかでキャスティングが必要になるので注意です。
試したことはないですがiPhoneはセグメント数がMaxで5とのことなので要素が6だとどうなるかはテストしていないです。
②セグメント数をtriggerとして受け取りobjectを生成
次にセグメント数を引数として先に定義したfloorTagsから必要数の要素を引っ張りだして新たにtitle用Arrayを生成します。
var segment:UISegmentedControl!
func floorSegmentView(floorNum:Int){
let floors:[String] = [String](floorTags[0...floorNum])
let segment = UISegmentedControl(items: floors)
}
簡単な説明です。segmentを選択したときのActionを設定する必要があるので先にsegmentを宣言しておきます。関数はfloorNumを引数にとり必要なsegment数を指定します。その後関数内で必要な要素数だけとりだしてfloorsを生成します。ここではまったのが単純にfloorTags[0...floorNum]だけだとArray要素として取り出されるので[String]でキャストしています。
③addViewではりつけ
segmentedControlのobjectが生成できたので次はViewにaddViewします。要素数に応じて位置ずれを防ぐために以下のような計算を入れてframeのwidthを計算しています。
var viewWidth = self.view.frame.width
var segmentFrameWidth = Int(viewWidth)-20
segment.frame = CGRect(x: 0, y: 0, width:segmentFrameWidth, height: 30)
segment.selectedSegmentIndex = 0
segment.frame.offset(dx: 10, dy: 480)
segment.tag = 1
self.view.addSubview(segment)
これで動的にsegment数を変えることができます。
今後:
Proto試作なのでべた書きで書いてしまったので、できればUISegmentedControlのextentionとかで書き直した方が汎用性がありそうです。