본문 바로가기

나의 플랫폼/iOS

[iOS] initWithCoder unrecognized selector sent to instance

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Model을 만들어 사용할 때 아래 와 같은 에러가 나올 경우,


[ModelVO initWithCoder:]: unrecognized selector sent to instance


한번 에러 나는 모델 소스가 아래와 같이 되어 있는지 확인 바란다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import Foundation
 
class ModelVO : NSObject {
 
    var num: Int
    var title: String
 
    init(qno: Int, question: String, answered: Int){
        self.num = qno
        self.title = question
        self.answered = answered
    }
    
    required init(coder aDecoder: NSCoder) {
        self.num = aDecoder.decodeInteger(forKey: "num")
        self.title = aDecoder.decodeObject(forKey: "title"as! String
    }
    
    func encodeWithCoder(_ aCoder: NSCoder!) {
        aCoder.encode(self.num, forKey: "num")
        aCoder.encode(self.question, forKey: "title")
    }
 
}
 
cs

위 소스에서 문제점은 encodedWithCoder 이다. 


NSCoding을 상속 받고, encode 함수를 오바라이딩 받습니다. 

그럼 소스가 아래와 같이 변경이 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import Foundation
 
class ModelVO : NSObject, NSCoding {
 
    var num: Int
    var title: String
 
    init(qno: Int, question: String, answered: Int){
        self.num = qno
        self.title = question
        self.answered = answered
    }
    
    required init(coder aDecoder: NSCoder) {
        self.num = aDecoder.decodeInteger(forKey: "num")
        self.title = aDecoder.decodeObject(forKey: "title"as! String
    }
    
    func encode(with aCoder: NSCoder) {
        aCoder.encode(self.num, forKey: "num")
        aCoder.encode(self.title, forKey: "title")
    }
}
 
cs

아카이빙을 항상 NSObject 와 NSCoding을 함께 쓴다고 생각 하면 될 듯 하다.

참고하세요.

'나의 플랫폼 > iOS' 카테고리의 다른 글

[iOS] UITableView scroll to top  (0) 2017.10.27
[iOS] change TableHeaderView height dynamically with autolayout  (0) 2017.10.26
[iOS] LocalNotification  (0) 2017.09.29
[iOS] Swift defer 블록  (0) 2017.09.14
[iOS] 'command + =' 단축키  (0) 2017.09.13