11565


お世話になります  
そもそも実装が間違ってるのかもしれないのですが、質問させてください

uitableviewcellで使うデータを別画面で作成して戻ってきた際に、特定のcellだけ更新作業を走らせようとしてるのですが、どうもうまく行きません

[code]

    //こだわりだけリロード
    func updateOtherKodawari(){
        let indexpath = NSIndexPath(forRow: 0, inSection: 5)
        self.appdelegate.shotvm.readData()
        self.menuview.beginUpdates()
        self.menuview.reloadRowsAtIndexPaths([indexpath], withRowAnimation: UITableViewRowAnimation.None)
        self.menuview.endUpdates()
    }
    
[/code]

ここだけリロードさせたくしておりまして

[code]

    case 5:
            let cell: OtherKodawariCell = tableView.dequeueReusableCellWithIdentifier("OtherKodawariCell", forIndexPath: indexPath) as! OtherKodawariCell
            return cell
    
[/code]

こんな感じで、cellは書いてあります。  
cell内では以下のようにしてありまして

[code]

    import UIKit
    
    class OtherKodawariCell: UITableViewCell {
    
    weak var appdelegate:AppDelegate!
    
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        self.appdelegate = AppDelegate.sharedAppDelegate()
        setUp()
    }
    
    func setUp(){
    
        var x = 0
        let top_margin_x = 8
        let margin_x = 10
        var y = 5
        let margin_y = 5
        let screen = UIScreen.mainScreen()
        let width = Int((screen.bounds.size.width-30)/2)
        let height = 20
    
        let ary_other_name_kodawari = self.appdelegate.appCode.dic_cond?.objectForKey("ary_other_name_kodawari") as? NSArray
    
        let ary_other_kodawari = self.appdelegate.appCode.dic_cond?.objectForKey("ary_other_kodawari") as? NSArray
    
        //空の場合は終了
        if ary_other_name_kodawari != nil{
            if ary_other_name_kodawari!.count == 0{
                return
            }
        }else{
            return
        }
    
    
        if let array = ary_other_kodawari{
            var i = 0
            for code in array{
    
                if i%2 == 0 && i != 0{
                    y += margin_y+height
                    x = top_margin_x
                }else if i == 0{
                    x += top_margin_x
                }
                let text: AnyObject? = ary_other_name_kodawari?.objectAtIndex(i)
                if let font = UIFont(name: "HiraKakuProN-W6", size: 10){
                    let size:CGSize = text!.sizeWithAttributes([NSFontAttributeName:font])
                    let tagview = TagView(frame: CGRect(x: x, y: y, width: width, height: height))
                    tagview.setUp(text! as! String, withfont: font, withsize: size)
                    self.addSubview(tagview)
                    x += width
                }
                x += margin_x
                i += 1
            }
        }
    }
    
    
    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    
        // Configure the view for the selected state
    }
    
    }
    
[/code]

自分のイメージだと、cellがcellのリロードでcellが再生成されて、cell内のawakeFromNibが呼ばれるのかなと思っているのですが、違うのでしょうか

よろしくお願い致します


CC BY-SA 3.0
2015-06-20T13:42:10.380
11562
2015-06-21T01:49:52.813
2015-06-21T01:49:52.813
7362
403
question
ios objective-c swift uitableview
特定のuitableviewcellのリロード時にcell内のawakeFromNibが呼ばれない


>
> 自分のイメージだと、cellがcellのリロードでcellが再生成されて、cell内のawakefromxibが呼ばれるのかなと思っているのですが、違うのでしょうか

cell の生成は重い処理であり、`UITableView` ではなるべくそれを避けるために、表示中の cell
は再生成しないようになっていると思います。また、スクロールで画面外に出た cell も開放せずに保持しておき、再利用するという仕組みになっています。

設定にもよりますが、いったん `UITableView` が表示されてから、新たに cell が生成されることがほとんどない、ということもよくあります。

そのため、cell の生成のタイミングで表示内容を決めていると、リロードしても表示内容は更新されません。

* * *

いちど使った cell が別の行で使われることもあるので、本来、cell の生成と同時に表示内容を確定させるのではなく、cell
には必要なラベルなどを用意するだけにしておき、`tableView(_:cellForRowAtIndexPath:)`
でそれに内容を設定する、という設計が期待されています。

`OtherKodawariCell` をそのように変更するのがベストだと思いますが、もっとも簡単な解決策は、この部分で、：

[code]

    case 5:
        let cell: OtherKodawariCell = tableView.dequeueReusableCellWithIdentifier("OtherKodawariCell", forIndexPath: indexPath) as! OtherKodawariCell
        return cell
    
[/code]

`OtherKodawariCell.setUp()` 相当の処理を行うことかな、と思います。

* * *

ただし、この処理は同じ cell に対して何度も呼ばれることもあるので、`setUp()`
のように、「空の場合は終了」するのではなく、不要なビュー等を削除したり、表示内容をリセットしたりする必要があります。

そのために `UITableViewCell` には、いちど表示された cell が再利用される前に呼ばれる `prepareForReuse()`
メソッドが用意されていますので、これをオーバライドして、必要な処理を書かれることをおすすめします。


CC BY-SA 3.0
2015-06-20T19:55:14.043
11565
2015-06-20T19:55:14.043
2299
11562
answer