19487
### はじめに

SwiftでiOSのアプリを開発しています。初心者です。  
こういった質問サイトへの投稿経験も浅いため、マナーや通例に反した質問をしてしまっているかもしれません。  
もしかすると、お門違いな点もあるかと思いますが、ご容赦願います。

* * *

### 本題

**所定のボタンを押すことで、xibで作成したTableViewCell（カスタムクラス :
CustomTableViewCell.swift）の中に、xibで作成したView（カスタムクラス :
CustomView.swift）を追加（addSubview）しようとしています。**  
しかし、以下問題が生じています。解決方法を教えてください。

**CustomTableViewCell.swift**

```

    class CustomTableViewCell: UITableViewCell {
        @IBOutlet weak var viewInCell: UIView!
    
        override func awakeFromNib() {
            super.awakeFromNib()
            // Initialization code
        }
    
        override func setSelected(selected: Bool, animated: Bool) {
            super.setSelected(selected, animated: animated)
    
            // Configure the view for the selected state
        } 
    }
    
```

**CustomView.swift**

```

    import UIKit
    
    class CustomView: UIView {
    
        /*
        // Only override drawRect: if you perform custom drawing.
        // An empty implementation adversely affects performance during animation.
        override func drawRect(rect: CGRect) {
            // Drawing code
        }
        */
    
        class func instance() -> CustomView {
            return UINib(nibName: "CustomView", bundle: nil).instantiateWithOwner(self, options: nil)[0] as! CustomView
        }
    
    }
    
```

（ **詳細1** ）  
CustomTableViewCellの中にViewを配置して、CustomTableViewCell.swiftにアウトレット接続しています。そして、
TableViewが配置されているViewController（MyViewController.swift）に、ボタンをアクション接続し、そのメソッドの中に、「"特定のセル"の（アウトレット接続した）Viewに、CustomViewをaddSubViewする」記述を書いています。

（ **詳細2** ）  
上記の特定のセルはTableViewの「visibleCells」プロパティで取得しています。

**MyViewController.swift**

```

     @IBAction func testBtn(sender: UIButton) {
            for cell in self.tableView.visibleCells as! [CustomTableViewCell]{
                let myView = CustomView.instance()
                cell.viewInCell.frame = myView.frame
                cell.viewInCell.addSubview(myView)
            }
        }
    
```

* * *

### 発生している問題

**1.addSubviewしたCustomViewが、CutomTableViewCellで定義したViewをはみ出て表示される。**  
ちなみに、CustomTableViewCell内の「awakeFromNib()」で、以下の様にaddSubviewした場合は、

```

    let myView = CustomView.instance()
    cell.viewInCell.frame = myView.frame
    cell.viewInCell.addSubview(myView)
    
```

Viewをはみ出ることなく表示されます。

**2.スクロールすると、addSubviewしたCustomViewが「visibleCells」で取得したセル以外のセルに反映される。また、スクロールして戻ってくると、そのCustomViewが消えていたりする。**  
こちらのサイト（<http://ios-
practice.readthedocs.org/en/latest/docs/tableview/>）に、それらしき記述はあるのですが、Objective-
cの知識がないことと、私の読解力のなさから自分のコードに適用するに至っておりません。また、これが本質的な解決方法であるのかも判断できていません。

* * *

### 補足情報(言語/FW/ツール等のバージョンなど)

Xcode version7.1.1
CC BY-SA 3.0
2015-11-30T19:17:04.263
19484
2015-12-01T00:53:49.490
2015-12-01T00:32:21.213
7362
13463
question
swift objective-c xcode xcode7
Swiftで、xibで作成したTableViewCellに、xibで作成したViewを追加
> 1.addSubviewしたCustomViewが、CutomTableViewCellで定義したViewをはみ出て表示される。

`cell.viewInCell`のプロパティ`clipsToBounds`を`true`にしてください。これは、Interface
BuilderのAttributes Inspectorでも変更できます。  
`UIView`のデフォルトでは、サブビューは、スーパービューのフレームをはみ出して、配置することができるようになっています。スーパービューからはみ出した部分を表示しないようにするには、このプロパティを変更します。

```

    cell.viewInCell.clipsToBounds = true
    
```

>
> 2.スクロールすると、addSubviewしたCustomViewが「visibleCells」で取得したセル以外のセルに反映される。また、スクロールして戻ってくると、そのCustomViewが消えていたりする。

`UITableView`の、セルを再利用するメカニズムの概要を理解しないと、問題の所在が把握できないと思います。テーブルの表示範囲に、たとえば10行が並んでいるとすると、セルの総数はせいぜいプラス2〜3個、12〜13個しかありません。テーブルの全行数だけセルが作られるのではなく、スクロールして非表示になったセルは、すぐにスクロールして表示される行に再利用されることを、理解する必要があります。  
『addSubviewしたCustomViewが「visibleCells」で取得したセル以外のセルに反映される。』のではなく、CustomViewをaddSubviewしたセルが、そのままテーブルの別の行に再利用されるのです。  
『スクロールして戻ってくると、そのCustomViewが消えていたりする』のではなく、CustomViewをaddSubviewしていないセルが、スクロールして再表示になった行に再利用されているのです。

なので、

```

    let myView = CustomView.instance()
    cell.viewInCell.frame = myView.frame
    cell.viewInCell.addSubview(myView)
    
```

このコードは、`CustomTableViewCell`の`awakeFromNib()`あたり（曖昧な表現で申し訳ありませんが）に実装するのが妥当と思われます。
CC BY-SA 3.0
2015-11-30T22:36:34.763
19487
2015-12-01T00:53:49.490
2015-12-01T00:53:49.490
7362
7362
19484
answer