2016-04-13 24 views
0

フェッチされたデータに基づいてボタンを作成する次のコードがあります。ボタンが作成された後、スクロールビューに追加されます。 そして、それらは水平に表示する必要があります。動的にスクロールビューにボタンを追加して追加する

データがあることを確認できますが、シミュレータには奇妙なことが表示されます(添付のスクリーンショットを参照)。私の実装で何が間違っていますか?

override func viewDidLoad() { 
    super.viewDidLoad() 

    fetchRecipeCategory() 

    for var i = 0; i < self.category.count; i++ { 
     let frame1 = CGRect(x: 20, y: 20 + (index * 45), width: 45, height: 45) 
     let button = UIButton(frame: frame1) 
     button.setTitle("\(category[i].name)", forState: .Normal) 
     button.backgroundColor = UIColor.blackColor() 
     self.categoryScrollView.addSubview(button) 

    } 
    print(category[0].name) 
} 

enter image description here

+2

'Optional(" yourData ")'が表示されているようです。あなたはそれをアンラップしようとしましたか? –

+0

良いキャッチだが重複する問題は依然として残っている。どのように私はそれを均等な分布で水平に広げることができますか? –

+0

あなたの質問を編集し、重複している問題があると述べるべきです。 –

答えて

1

あなたはボタンごとに異なるy frame値を使用する必要があります。あなたのボタンの作成は、そのyフレームにindexを使用していて、それを増分していません。

あなたのループはforループを使用しているので、i値を使用できます。

let frame1 = CGRect(x: 20, y: 20 + (i * 45), width: 45, height: 45) 

このコードはボタンの垂直リストを作成します。あなたは各ボタンあなたのスクリーンショットについては

let frame1 = CGRect(x: 20 + (i * 45), y: 20, width: 45, height: 45) 

ためx frame値を変更し、水平にあなたのボタンを一覧表示したい場合は、ボタンのタイトルがOptional("data")に設定されていることのように見えます。データソースにデータが含まれていることが本当にわかっている場合は、単純にボタンのタイトルのラップを解除することができます。オプションのバインディングを使用する方がよいでしょう。

+0

ありがとう。オプションのバインディングとは何ですか? 'if let _ = value {}'やガード?あなたのケースでは 'if let'で十分であるはずです。 –

+0

これらの2つの比較に興味がある場合は、http://stackoverflow.com/questions/32256834/swift-2-0-guard-vs-if-letを参照してください。 –

関連する問題