'Swift'에 해당되는 글 2건

  1. 2017.07.16 add multi addObserver for KVO
  2. 2015.12.30 [swift를 이용한 ios 앱 만들기] 버튼 만들기

add multi addObserver for KVO

ios 2017. 7. 16. 16:17

using addObserver function to observe one or more specific values, should be able to separate values.


ex. If we have Label1 and Label2, we don't know what is Label1's value in observeValue function.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// define two UILabel
@IBOutlet var label1: UILabel!
@IBOutlet var label2: UILabel!
 
// add addObserver to each label
label1.addOberver(self, forKeyPath: "text", options: [.old, .new], context: nil)
label2.addOberver(self, forKeyPath: "text", options: [.old, .new], context: nil)
 
// value watch through observeValue
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == "text" {
        print("old text : ", change?[.oldKey])
        print("new text : ", change?[.newKey])
    }
}
cs


In above observeValue, It is hard to know what is label1's value.


To solve this problem, we can use context parameter in addObserver.


context means Arbitrary data that is passed to observer in.


Using context parameter, we can solve this problem.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// label1, label2 data for context
private static var label1 = 0
private static var label2 = 1
 
// define two UILabel
@IBOutlet var label1: UILabel!
@IBOutlet var label2: UILabel!
 
// add context argument data 
label1.addOberver(self, forKeyPath: "text", options: [.old, .new], context: &MyClass.label1)
label2.addOberver(self, forKeyPath: "text", options: [.old, .new], context: &MyClass.label2)
 
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    // using context value, classify each label's value
    if context == &label1 {
        print("old label1 text : ", change?[.oldKey])
        print("new label1 text : ", change?[.newKey])
    } else if context == &label2 {
        print("old label2 text : ", change?[.oldKey])
        print("new label2 text : ", change?[.newKey])    
    } 
}
cs


Posted by 사용자 guru_k

댓글을 달아 주세요

텍스트 만들기에 이어 버튼 만들기 입니다.


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var btn = UIButton()
 
// btn width, height Size -- 버튼 크기 설정
btn.frame.size.width = 50
btn.frame.size.height = 50
// btn alignment Center -- 중앙 정렬
btn.frame = CGRectMake(width/2 - btn.frame.size.width/2
height/2 - btn.frame.size.height/2
btn.frame.size.width, 
btn.frame.size.height);
// btn Background Color -- 백그라운드 색상 설정
btn.backgroundColor = UIColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 1)
// btn cornerRadius -- 버튼 코너 설정
btn.layer.cornerRadius = 10
// btn setTitle -- 버튼 내 text 설정
btn.setTitle("클릭", forState: UIControlState.Normal)
// btn addTarget -- 타겟 설정
btn.addTarget(self, action: Selector("touchBtn:"), 
forControlEvents: UIControlEvents.TouchDown)
 
// display       
self.view.addSubview(btn)
cs



* 앞 부분 텍스트 만들기에 이어서 진행되었기에 btn.frame 부분의 width와 height는 view.frame의 사이즈를 저장해논 변수 입니다.

var width : CGFloat = self.view.frame.size.width

var height : CGFloat = self.view.frame.size.height


출력 화면



Posted by 사용자 guru_k
TAG ios, iosapp, Swift

댓글을 달아 주세요