2016-07-18 5 views
3

私はコレクションビューとボタンの内側にあります。 このボタンをタップすると、その名前を変更したいと思います。 私はそれをすることができましたが、私はそれをタップすると、私は20のボタンが10個あればこのように変化します。最初のボタンをタップすると0,2,4,6,8が変わり、リスト内では、すべてのボタンがチェックされます。私はあまりにもif文なしで試してみましたセル内のボタンのタイトルを変更する方法Swift

@IBAction func following(sender: AnyObject) { 
     if follow.tag == sender.tag { 
     follow.setTitle("Following", forState: .Normal) 
     } 
     print("\(follow.tag) \(sender.tag)") 
    } 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Interest Cell", forIndexPath: indexPath) as! ThirdTabCell 

     cell.follow.tag = indexPath.row 
     return cell 



     } 

ボタンの機能の内部ではなく、再び同じ問題:

は、これは私のコードです。 タグを印刷すると、タップされたボタンだけが印刷されます。

は、私も自分のViewControllerに

cell.follow.addTarget(self, action: #selector(ThirdTab.follow(_:)), forControlEvents: UIControlEvents.TouchUpInside) 
//inside cellForItemAtIndexPath 

    func follow(sender:UIButton!) { 



     } 
+0

私はどこに次のように尋ねてもいいですか?再使用可能なセルからIBActionを取得できないようにする必要があります。また、私は送信者がAnyObjectの代わりにUIButtonになるはずですか? – Happiehappie

+0

ibaction関数がセルクラスの内側にある –

+0

VCでセレクタメソッドを作成することをお勧めします。 – Happiehappie

答えて

3

ただ、簡単な概要、これを試してみました、だからあなたはあなたの答えを得る

UICollectionViewが高度に最適化されているので、唯一のオンスクリーンメモリに表示される行を保ちます。現在、すべての行のセルはプールにキャッシュされ、再利用され、再生成されません。ユーザーはUICollectionViewをスクロールするたびに、Pool内に隠れた行を追加し、次に見える行のためにそれらを再利用します。

だから、今、あなたの答えに来

あなたがボタンをタップは、そのタイトルが更新されますが、あなたはあなたのコレクションビュー、「更新ボタンのテキスト」と同じセルをスクロールする時期になります再使用され、が表示されます。

SOLUTION

SAVEボタン状態配列で、あなたのアクションメソッド

@IBAction func following(sender: AnyObject) { 
     if follow.tag == sender.tag { 
      array[sender.tag] = "<text>" 
      collectionView.reloadData() 
     } 
     print("\(follow.tag) \(sender.tag)") 
    } 

とあなたのデータソースメソッド内であなたのボタンのテキストは以下のように更新 :

//トリックは、各インデックスのボタンテキストを更新することです

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell{ 
    //SAMPLE CODE 
    let buttonValue = array[indexPath.index] 

    // update button value for each index 
    //trick is to update your button text for each index  
    cell.button.setTitle("", forState: .Normal) 
} 
+0

私のviewcontrollerのすべての権利は? –

+0

はい! \t ビューコントローラのすべて –

+0

動作しませんでした...私はいくつかの変更を試み、 –

0

以下の機能では、設定したタイトル行の下に変更してください。

既存ライン:

follow.setTitle("Following", forState: .Normal) 

ニューライン:これはあなたのために働いている

follow.setTitle("Following", forState: UIControlState.Normal) 

希望。

おかげ

+0

再度同じ問題(私はあなたにdownvoteをしなかった) –

+0

ちょうどSwiftの列挙のための.Normalことができます。 UIControlStateを持つ。今何もしません – Happiehappie

1

私はあなたがそれこのように接近することをお勧め。あなたはこの

cell.followOutlet.tag = indexPath.row 

のようなボタンのコンセントを割り当てることができ、その後、あなたのフォロー機能の内部で使用すると、この

@IBAction func following(sender: AnyObject) { 
     let follow = sender as! UIButton 
     let indexP = NSIndexPath(forRow: follow.tag, inSection: 0) 
     let cell = yourCollectionView.cellForItemAtIndexPath(indexP) as! yourCellName 

     follow.setTitle("Following", forState: .Normal) 

    } 

を行うことができますそして今、あなたがあなたのボタンでやりたいことができcellForItemAtIndexPathインサイド

+0

再び同じ問題はありません –

関連する問題