2016-08-23 8 views
0

サブクラスUITableViewCellは、NSNotificationCenterにオブザーバを追加します。awakeFromNibです。しかし、このクラスには暗黙的にアンラップされたオプションのasプロパティもあります。 aPropertyを設定することができます前に、暗黙のうちにアンラップされたオプションのレジスタを持つUITableViewCellは、いつ通知用に登録する必要がありますか?

class aCell: UITableViewCell() { 

    var aProperty: Int! 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     NSNotificationCenter.defaultCenter().addObserver(...) 
    } 

    func notificationReceived() { 
     print(aProperty) 
    } 
} 

しかしawakeFromNibが呼び出されます。それがnilとアプリがクラッシュしている間

let cell = tableView.dequeueReusableCellWithIdentifier(...) 
    cell.aProperty = 1 

通知のイベントでプロパティを設定する前に、notificationReceivedaPropertyにアクセスします。

プロパティを設定した後、メソッドとして手動で呼び出す必要がない場合、セルは通知のためにどこに登録する必要がありますか?

+0

にnilでないことを確認すると良いでしょう、それはaPropertyする必要がある非オプションのですか?あなたのビジネスロジックを壊さないなら、それをオプションにすることができます。例えば"var aProperty:Int?" – firstinq

+0

私はいつもそれを包む必要はないので、利便性の問題です。 – Manuel

+0

その場合は、1. "notificationReceived"関数でプロパティがnilかどうかをチェックするか、または2.そのプロパティの初期値を設定します。 – firstinq

答えて

0

クラッシュを避けるために通知をできるだけ遅く登録しようとすると、100%確実に遅れることはありませんので、悪い考えです。

それはちょうど価値があなたのケース

class aCell : UITableViewCell 
{ 
    var aProperty: Int! 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(notificationReceived(_:)), name: "...", object: nil) 
    } 

    deinit { 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

    func notificationReceived(notification: NSNotification) { 
     guard let aProperty = self.aProperty else { 
      return 
     } 
     print(aProperty) 
    } 
} 
+0

、私は本当に痛みであるOptionalsを使わなければならないと思う。私が設定したパラメータは決して無限にならないことが分かっているからです。しかし、初期化は 'dequeueReusableCellWithIdentifier'によって管理されているので、独自の初期化子を使用することはできません。 – Manuel

関連する問題