Dear apple UIKit Developer
UITextView Placeholder 만들어조 plz... Thx..
TextView Placeholder
텍뷰 플레이스홀더는 기본적으로 제공되지 않는다.
도대체 그 이유를 알 수가 없어. 왜 제공을 안하는 건지..;;여하튼!
그래서 눈속임으로 만들어주는 건데 대강 사용하는 건 UITextViewDelegate 프로토콜을 채택해 프로토콜 메소드를 통해서 기능을 구현해주면 된다. 내부에서 텍스트뷰가 편집이 시작될 시점과 편집이 끝나는 시점과 관련된 메소드를 잘 활용해서 플레이스 홀더 기능을 하게끔 텍스트뷰의 텍스트의 색상값과 텍스트값을 주면 된다.
UIButton, UITextField > Action이 가능
UITextView, UISearchBar, UIPickerView > Action이 불가능
왜일까?
그 원리를 보면,
Inspector 영역에서 보면
View를 상속받고 Control을 상속받은 친구들인 것에 반해, UIControl 객체를 상속받지 않았기 때문이다.
Delegate는
객체 지향 프로그래밍에서 하나의 객체가 모든 일을 처리하는 것이 아니라
처리 해야 할 일 중 일부를 다른 객체에 넘기는 것을 뜻한다.
쉽게 말해서 우리가 해야할 일을 대신해서 해주는 느낌
tableView.delegate = self
-> 테이블뷰가 할 일을 뷰컨이 대신 해주는 것
- Delegate의 역할?
어떤 행동에 대한 동작을 제시
동작/행동을 공급하는 역할 supplies the behaviour.
객체의 동작을 수정할 수 있게 한다.
- DataSource의 역할
데이터를 받고 보여주는 것을 담당 / 시각적 모양에 대한 최소한의 정보를 제공
앱이 보여주는 콘텐츠와 관련된 객체
앱의 데이터 모델과 관련된 객체
데이터를 공급하는 역할 supplies the data
ex. 몇 개의 아이템, 이 아이템들을 보여줄 때는 어떤 뷰를 사용해야 하는지
MVC에서 데이터소스는 모델에 속하고, 델리게이트는 컨트롤러에 속한다.
그래서, TextView는 왜 Delegate 밖에 없을까? 왜 DataSource는 없을까?
jack님 보고 계신다면 정답을 알려조.. 궁예...뿐..
UICollectionViewDataSource
UIPageViewControllerDataSource
UIPickerViewDataSource
UITableViewDataSource
이놈들은 있는데 말이지.......
ATS
http는 열리지 않는데 왜냐하면 보안상 좋지 않기 때문이다.
이 사이트를 처리하기 위해서 App Transport Security Setting(ATS)을 해줘야 한다. 이건 info.plist에서 할 수 있다.
- 앱이 서버에 전송하는 데이터에 대한 보안을 설정하는 부분이다.
- HTTP와 다르게 HTTPS는 데이터 패킷을 암호화해서 전송하기 때문에 보안상 안정적이다.
- 16년 12월 이후 이를 사용할 경우에 리젝 사유에 포함한다고 한다.
- 모든 도메인에 대한 HTTP 통신을 허용
- 특정 도메인만 선택적으로 HTTP 통신 허용
예외적으로 허용할 도메인을 Key값에 입력하고, 타입은 딕셔너리를 선택한다.
앞에 www는 작성하지 않는다.
- NSExceptionAllowsInsecureHTTPLoads는 해당 도메인에 대한 HTTP 접속을 허용 여부를 의미해서 Bool 타입이다.
- NSIncludesSubdomains는 해당 도메인의 서브 도메인까지 설정에 포함할 건지 결정하는 역할이다.
WebView - 새로고침, 뒤로가기, 앞으로가기
이거 있는지 첨알았다. 웹뷰 연결하는 건 알았지만서도.. 댕신기..
http해주려면 인포피리스트가서 .. 허용 YES해줘야 함
옵셔널 바인딩으로 처리해준 이유는 없는 url일 수 있거나
또는 오타가 발생해서 잘못된 url일 수 있기 때문에 Nil값이 생길 수 있기 때문이다.
request 인스턴스를 통해서 URLRequest 구조체를 초기화해준다.
URLRequest라는 구조체는 URL, 캐시정책(default값이 .useProtocolCachePolicy), 요청에 대한 시간초과(default값이 60초)를 파라미터로 갖는 초기화 구문이 있는데 아래와 같다.
여기에서 우리는 URL만 파라미터로 넘겨주면 된다.
그리고 load 메소드를 통해서 해당 url로 콘텐츠로 로드하고 해당 개체로 이동하면 된다.
//
// WebViewController.swift
// NetworkBasic
//
// Created by heerucan on 2022/07/28.
//
import UIKit
import WebKit
class WebViewController: UIViewController {
// MARK: - Property
// http는 App Transport Security Setting을 해주지 않으면 열리지 않는다.
var destinationURL: String = "https://www.apple.com"
// MARK: - IBOutlet
@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet weak var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
openWebPage(url: destinationURL)
searchBar.delegate = self
}
// MARK: - IBAction
@IBAction func backButtonClicked(_ sender: Any) {
if webView.canGoBack {
webView.goBack()
}
}
@IBAction func reloadButtonClicked(_ sender: Any) {
webView.reload()
}
@IBAction func forwardButtonClicked(_ sender: Any) {
if webView.canGoForward {
webView.goForward()
}
}
// MARK: - Custom Method
func openWebPage(url: String) {
guard let url = URL(string: url) else {
print("Invalid URL")
return
}
let request = URLRequest(url: url)
webView.load(request)
}
}
// MARK: - UISearchBarDelegate
extension WebViewController: UISearchBarDelegate {
// searchBar의 searchButton 눌렀을 때
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
guard let searchBarText = searchBar.text else { return }
openWebPage(url: searchBarText)
}
}
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[Swift] Class와 Struct 그리고 부스러기 개념들 (0) | 2022.07.29 |
---|---|
[Swift] 스위프트 성능 이해하기1 - Struct / Class (0) | 2022.07.29 |
[iOS] PickerView (0) | 2022.07.28 |
[iOS] 프로토콜 (0) | 2022.07.28 |
[iOS] '처음으로' 돌아가는 코드 | SceneDelegate에서 분기처리해주는 코드 (0) | 2022.07.27 |