728x90
반응형


사용자에게 경고를 보여주거나 다시 한번 되물을때 Alert 기능을 사용합니다.


iOS에서도 간단하게 Alert 창을 구현할 수 있도록 지원을 하고 있는데요.


UIAlertController를 사용하여 만들어 보겠습니다.








프로젝트를 하나 만들어서 Storyboard 의 UIViewController에 버튼 2개를 만들었습니다.


Alert 과 ActionSheet 라는 버튼을 만들어 주었습니다.


Alert 버튼과 ActionSheet 버튼을 alertAction이라는 함수로 연결해주었습니다.







    @IBAction func alertAction(_ sender: UIButton) {
        if sender.titleLabel?.text == "Alert" {
            showAlert(style: .alert)
        } else {
            showAlert(style: .actionSheet)
        }
    }
cs


UIAlertController는 preferredStyle에 따라 Alert이 다르게 표현됩니다.

버튼 title이 Alert이면 style을 alert으로 정하고 아니면 actionSheet로 정해주었습니다.


style만 다르고 나머지 부분은 동일하기 때문에 showAlert이라는 함수를 만들어 주었습니다.







    func showAlert(style: UIAlertController.Style) {
        let alert = UIAlertController(title: "알림", message: "내용", preferredStyle: style)
        let success = UIAlertAction(title: "확인", style: .default) { (action) in
            print("확인")
        }
        
        let cancel = UIAlertAction(title: "취소", style: .cancel, handler: nil)
        let destructive = UIAlertAction(title: "삭제", style: .destructive)
        
        alert.addAction(success)
        alert.addAction(cancel)
        alert.addAction(destructive)
        
        self.present(alert, animated: true, completion: nil)
    }
cs


UIAlertController를 생성해주고 각 액션을 추가해주었고


각 기능을 하는 UIAlertAction 을 만들어 style을 다르게 설정하였습니다.


default : 일반적인 액션 버튼 


cancel : actionSheet로 표현 되거나 alertAction이 많아지면 맨 아래에 위치하게 됩니다.


estructive : 글자를 Red 색으로 표현해준다.





Alert 버튼 클릭 - 액션이 3개 이상





Alert 버튼 클릭 - 액션이 2개 이하







ActionSheet 버튼 클릭







각 UIAlertAction의 handler 에서 기능을 처리 하면 됩니다.


이렇게 간단하게 UIAlertController에 대해서 알아보았습니다.


728x90
반응형

'프로그래밍 > iOS' 카테고리의 다른 글

[XCode] Cocoapod Build Error  (0) 2019.12.20
[XCode 11] iOS 13 다크모드 해제  (0) 2019.12.09
Swift 4 TableView Section  (0) 2019.03.04
Swift 4 UIRefreshControl  (0) 2019.03.04
Swift 4 TableViewCell SwipeAction  (0) 2019.02.21
728x90
반응형

Mac OS X  업데이트 되면서 작지만 사용자에게 편리한 기능들이 추가되고 있습니다.


많은 사용자들이 불편해 하는게 윈도우처럼 한/영 버튼 하나로 입력 문자를 변경할 수 없었다는 것이였죠.





맥에서 한/영 전환하는 방법은 command + space 조합으로 전환이 가능했었습니다.


그리고 El Capitan 버전부터는 control + space 조합으로 한결 나아진 한/영 전환으로 업그레이드가 되었지만


그래도 사용자는 키를 조합해야만 전환이 되는것이 너무 불편해 했습니다.





다행이 Mac OS X Sierra 버전부터는 Caps Lock 버튼 하나로 한영 전환이 가능해졌습니다.



기존 Caps Lock과 겹치긴 하지만 기본 기능을 입력 문자 전환이 가능하며


본연 기능은 option 또는 shift + caps lock 키를 누르면 됩니다.


728x90
반응형
728x90
반응형


맥프로 2008 이 늘 말썽이네요.



지구가 도는 모습을 너무 보고 싶었어요.


command(⌘) + R 키를 재시동 할때 눌러서 복구모드에 들어가려고 했지만 안되서 포기했었습니다.


Snow Leopard 10.6 DVD Install 파일을 구해서 시동디스크로 만들어 설치를 하였습니다.


현재 El Capitan 까지 Mac OS X 를 업그레이드 한 다음에 왜 복구모드가 안들어 가졌는지 알아봤습니다.





Apple 사이트에서도 나와있지않아 엄청난 검색을 통해 알아본 결과


Mac OS X 10.7 이상의 버전부터 복구모드를 지원하는 겁니다.


그 이전 버전이라면 저처럼 DVD 를 통한 Install 방식만으로 재설치 또는 초기화를 진행하여야 합니다.





다음엔 맥프로 2008 Leopard 10.5.8 에서


Snow Leopard 10.6 버전으로 업그레이드 하는 방법을 정리해 보겠습니다.


728x90
반응형
728x90
반응형


iPhone의 연락처 앱처럼 구분을 하여 목록을 보여주고 싶을 때가 있습니다.


블로그나 유튜브를 찾아봐도 TableView의 Section 구분만 나오는게 아닌


특정 기능까지 포함해서 나오기에 복잡해서 어려움도 많았습니다.


딱! 간단하게 TableView Section 처리하는 방법을 알아보겠습니다.







Storyboard에서 UIViewController에 TableView와 TableViewCell 을 추가해줍니다.


TableViewCell의 Attributes Inspactor 로 들어가


Identifier 를 'CellList' 라고 정해주었습니다.


이제 Swift 코드로 들어가보겠습니다.






import UIKit
 
class ViewController: UIViewController {
 
    @IBOutlet weak var tableView: UITableView!
    
    // 임의 데이터 넣기
    var items: [String= ["Apple""Facebook""Google""Kakao""Naver""NcSoft""Github"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.delegate = self
        tableView.dataSource = self
    }
}
cs


Storyboard의 TableView를 @IBOutlet 변수로 연결해주었고


tableVIew의 delegate, dataSource 를 'self'로 지정해 주었습니다.






extension ViewController: UITableViewDelegate, UITableViewDataSource {
    
    // Section count
    public func numberOfSections(in tableView: UITableView) -> Int {
        return Array(Set(self.items.map{ $0.first! })).count
    }
    
    // Section의 title
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int-> String? {
        return String(Array(Set(self.items.map{ $0.first! })).sorted()[section])
    }
    
    // row 의 data 대입
    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let charactor = Array(Set(self.items.map{ $0.first! })).sorted()[indexPath.section]
        let cell = tableView.dequeueReusableCell(withIdentifier: "CellList"for: indexPath)
        cell.textLabel?.text = self.items.filter{ $0.first == charactor }[indexPath.row]
        return cell
    }
    
    // Section의 Row count
    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int-> Int {
        let charactor = Array(Set(self.items.map{ $0.first! })).sorted()[section]
        return self.items.filter{ $0.first! == charactor }.count
    }
}
cs


ViewController 를 확장하여 TableView 프로토콜을 준수해 함수를 정의하였습니다.


각각 설명을 하겠습니다.





1. Section의 count를 return 합니다.


public func numberOfSections(in tableView: UITableView) -> Int
cs

return Array(Set(self.items.map{ $0.first! })).count
cs

items 라는 array를 map{ $0.first! } 하면 $0로 각각 한개씩 담겨지게 되고


first 변수에는 첫글자만 배열로 반환합니다.


반환된 배열을 Set 으로 담으면 중복이 제거됩니다.


Set을 다시 Array로 변환한 뒤 count를 return 합니다.


이렇게 해서 중복이 제거된 앞글자의 합을 Section count로 return 하였습니다.





2. Section의 title을 생성합니다.


func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int-> String?
cs


return String(Array(Set(self.items.map{ $0.first! })).sorted()[section])
cs


Section count와 동일하게 한글자를 가져오고 각 section에 맞게 title이 셋팅됩니다.






3. 각 Section의 row count를 return 합니다.


public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int-> Int
cs


let charactor = Array(Set(self.items.map{ $0.first! })).sorted()[section]
return self.items.filter{ $0.first! == charactor }.count
cs


현재 Section에 해당되는 첫번째 문자열을 추출합니다.


filter{ $0.first == charactor} 배열에 들어있는 값과 추출한 문자열을 비교하여 맞는 값의 count를 return합니다.






4. 각 row에 data를 대입합니다.


public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
cs


let charactor = Array(Set(self.items.map{ $0.first! })).sorted()[indexPath.section]
let cell = tableView.dequeueReusableCell(withIdentifier: "CellList"for: indexPath)
cell.textLabel?.text = self.items.filter{ $0.first == charactor }[indexPath.row]
return cell
cs



현재 Section에 해당되는 첫번째 문자열을 추출합니다.


TableViewCell을 연결해줍니다.


filter{ $0.first == charactor } 배열에 들어있는 값과 추출한 문자열을 비교하여 맞는 값을 꺼낸 뒤


그안에서 indexPath.row 에 해당되는 값을 꺼내 textLabel에 넣어줍니다.






이렇게 Section 을 간단하게 분리해 보았습니다.


응용을 한다면 날짜별로 Section을 분리하는것도 쉽게 구현이 가능합니다.


728x90
반응형

'프로그래밍 > iOS' 카테고리의 다른 글

[XCode 11] iOS 13 다크모드 해제  (0) 2019.12.09
Swift 4 UIAlertController  (0) 2019.03.05
Swift 4 UIRefreshControl  (0) 2019.03.04
Swift 4 TableViewCell SwipeAction  (0) 2019.02.21
Swift 4 TextView PlaceHolder  (0) 2019.02.21
728x90
반응형


애플제품들은 하나같이 맥 전용 액세서리가 있습니다.


맥 미니에 HDD + SSD를 추가 할때에도 전용 HDD 커넥터를 구매해야 합니다.


이번 맥프로에 SSD 를 추가하려고 하는데 3.5 HDD 와 크기가 다르기에 보조하는 액세서리를 구매해야 합니다.





일반적으로 맥에서 많이 사용하는 가이드는


Sabrent 2.5 to 3.5 SATA bay converter 제품을 해외직구로 구매해 사용하더군요.

중고나라 맥 관련업자들도 하나에 2만원씩 파는데 Sabrent제품인지도 모르겠고 해서 찾아봤습니다.






한국에서 AS도 가능한 오리코(Orico) SSD Guide 입니다.


출처 : 오리코


일반 하드와 크기 및 볼트 위치까지 동일하게 되어있으며 ABS 재질로 되어있습니다.


이전 모델인 1025가 1만 8천원 정도로 HDD와 비슷한 형태였지만 단종되어 신형인 1125SS가 나왔습니다.


오픈마켓에서 1만원 전후로 판매되고 있어서 저렴하게 구매할 수있었고. 해외 직구를 하지않아도 된다는게 너무 좋네요.


2개 주문을 하고 하루나 이틀 뒤에 도착할것 같습니다.


도착하면 상세 후기를 남기도록 하겠습니다.



728x90
반응형
728x90
반응형

리스트 형식의 TableView 를 사용할 때에 새로고침 버튼을 두는것보다


아래로 당기면서 새로고침을 진행하는게 좋습니다.


네이버나 페이스북 유튜브의 경우에도 제일 상단 목록을 아래로 당기면 새로운 목록이 나오게 됩니다.


iOS에서도 이러한 기능을 지원을 하고 있어서 정리합니다.





UIRefreshControl 의 내부를 보겠습니다.


@available(iOS 6.0*)
open class UIRefreshControl : UIControl {
 
    
    /* The designated initializer
     * This initializes a UIRefreshControl with a default height and width.
     * Once assigned to a UITableViewController, the frame of the control is managed automatically.
     * When a user has pulled-to-refresh, the UIRefreshControl fires its UIControlEventValueChanged event.
     *
    */
    public init()
 
    
    open var isRefreshing: Bool { get }
 
    
    open var tintColor: UIColor!
 
    open var attributedTitle: NSAttributedString?
 
    
    // May be used to indicate to the refreshControl that an external event has initiated the refresh action
    @available(iOS 6.0*)
    open func beginRefreshing()
 
    // Must be explicitly called when the refreshing has completed
    @available(iOS 6.0*)
    open func endRefreshing()
}
cs


iOS 6.0 버전 이상부터 지원이 가능하고 UIControl 을 상속 받고 있습니다.


isRefreshing 은 현재 리프레쉬가 진행중인지를 나타냅니다.


tintColor 로 색상도 바꿀수 있구요.


attributedTitle 은 새로고침 indicator 아래에 텍스트를 설정합니다.


beginRefreshin 함수는 새로고침 시작을 알립니다.


endRefreshing 함수는 새로고침이 끝남을 알립니다.






이젠 실습으로 구현해 보겠습니다.



Storyboard 의 UIVIewController 에 TableView와 TableViewCell을 만들어 줍니다.


TableViewCell의 Attributes inspactor에 들어가서 indentifier 를 'Cell'로 정의해주었습니다.


Storyboard는 이정도만 만들고 Swift 코드로 넘어가겠습니다.





import UIKit
 
class ViewController: UIViewController {
    
    var array = ["Samsung""Apple""Lg""Google""Facebook"]
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        initRefresh()
    }
    
    // UIRefreshControl 초기 설정
    func initRefresh() {
        let refresh = UIRefreshControl()
        refresh.addTarget(self, action: #selector(updateUI(refresh:)), for: .valueChanged)
        refresh.attributedTitle = NSAttributedString(string: "새로고침")
 
        if #available(iOS 10.0*) {            
            tableView.refreshControl = refresh
        } else {
            tableView.addSubview(refresh)
        }
    }
    
    // 새로고침 함수
    @objc func updateUI(refresh: UIRefreshControl) {
        refresh.endRefreshing() // 리프레쉬 종료
        tableView.reloadData() // 테이블 뷰 로드
    }
}
 
cs


샘플로 만들었으며 array라는 배열에 임이의 값을 넣어주었습니다.


TableView를 IBOutlet 변수로 선언을 해주고 Storyboard의 TableView와 연결을 해주고


delegate와 dataSource를 self로 대입해 나 자신이 delegate와 dataSource 프로토콜을 준수하고 있다고 정의해줍니다.


UIRefrechControl 인스턴스화 하여 target을 설정해주면 스와이프 액션이 주어졌을때 연결한 uidateUI함수를 호출해 줍니다.




iOS 10 이전 버전은 TableView에 view를 등록해 주고, 이후는 TableView에 refreshControl 프로퍼티가 존재함으로 대입해 주면 됩니다. 


updateUI함수가 호출되면 리프레쉬를 종료하는 endRefreshing함수를 호출함으로써 새로고침 UI는 마무리가 되고


TableVIew를 재조회 합니다.





extension ViewController: UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
        cell.textLabel?.text = array[indexPath.row]
        return cell
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int-> Int {
        return array.count
    }
}
cs


TableView 관련코드 입니다.


기존의 글에 많이 동일한 코드를 구현했으니 설명은 생략합니다.







TableView를 아래로 당겨줍니다.






설정했던 '새로고침'과 indicator가 나오면서 테이블을 재조회 합니다.





간단하게 TableView를 Refresh하는 방법을 알아보았습니다.


728x90
반응형

'프로그래밍 > iOS' 카테고리의 다른 글

Swift 4 UIAlertController  (0) 2019.03.05
Swift 4 TableView Section  (0) 2019.03.04
Swift 4 TableViewCell SwipeAction  (0) 2019.02.21
Swift 4 TextView PlaceHolder  (0) 2019.02.21
Swift 4 WKWebView 로딩(Indicator)  (0) 2019.02.20
728x90
반응형


회사 일을 하면서 처음으로 개인돈 주고 구입해본 데스크탑 입니다.


포토샵, 마크업 개발 툴, 자바 개발 툴 등을 돌려보려고 구매했지만


집에서는 잘 사용하지 않게 되었습니다.





회사에서 거의 살다시피 하며 맥 프로를 사용하고 있어서 


윈도우와 호환도 안맞고 프로그램도 다시 설치하기 귀찮고 해서 잘 사용하지 않았었네요.



마이크로 닉스가 좋다고해서 파워랑 케이스까지 같이 구매를 했었습니다.


모니터 3개도 잘 출력되고 그냥 그맛에 만족 했던것 같습니다.








시놀로지 나스도 사용하고 맥도 막 구매하다보니


이렇게 버려진 윈도우용 데스크탑 이젠 떠나 보내려 합니다.







더 빠르게 돌아가길 원해서 WD 사의 SSD 240 Green 제품을 구매해서 달아주었습니다.


윈도우 10을 설치하고 나서 부팅 속도가 엄청나게 빨라진걸 보고 할것도 없어서 피시를 종료해줬죠.







하는것도 없는데 GTX 750을 사용하려고 500W 파워를 달아줬는데


그만큼 파워 뽑을일도 없었습니다.







선정리도 잘 못해줘서 미안한 데스크탑이 좋은 주인을 찾았으면 좋겠습니다.


너무 예쁜 맥에 뒤쳐져 신경못써줘서 미안.


728x90
반응형
728x90
반응형


Mac Pro 2008 을 구매하였는데


이 버전은 복구 보드가 안들어가지는것 같습니다.


OS X를 설치하는것도 버거운데 기존에 사용하시던 분이 초기화를 안해주셔서


SSD가 오기전에 HDD에 연습해보려고 초기화 없이 OS X를 설치 했습니다.





그래도 제 계정도 아니고 기존에 사용하던 쓰레기 데이터 들이 많기 때문에


복구 모드로 들어 가지 않고 초기화 하는방법을 찾았습니다.





sudo -# 루트 계정 접근
cs

루트 계정으로 접속 합니다.




rm -fr /var/db/.AppleSeupDone
cs

사용자의 설정정보를 'rm' 명령어로 제거합니다.





dscl .delete /Users/사용계정
cs

GUI환경에서 사용자를 삭제하는것과 동일한 명령어를 입력하여 사용자를 삭제합니다.





rm -fr /Users/사용계정
cs

사용자의 데이터를 전부 삭제하는 명령입니다.




reboot
cs

마지막으로 재시동 명령어를 입력해주면 맥이 다시 실행되면서


최초의 설정화면이 나옵니다.


저처럼 구형 맥을 사용하시는 분들에게 없어서는 안되는 방법이니 잘 사용하시기 바랍니다.


728x90
반응형

'일상 리뷰 > Apple Mac' 카테고리의 다른 글

Mac OS X Caps Lock 키로 한/영 전환  (0) 2019.03.05
Mac OS X 복구모드  (3) 2019.03.05
Mac OS X 안전 모드 시동  (0) 2019.03.03
Mac OS X 디스크 이름 바꾸기  (2) 2019.03.03
일반 키보드 Mac OS 사용  (0) 2019.02.27
728x90
반응형


안전 모드는 Mac OS X 가 문제가 발생하여 시동을 하지 못하거나 


Apple지원을 받을 시에 문제를 확인하는 용도로 사용합니다.






잘못된 프로그램을 설치하여 오류로 인해 시동도 안된다면


엄청 답답하지 않을까요?





그래서 애플에서는 안전 모드로 들어가 기본적인 프로그램 외에는


실행이 되지 않도록 제한하고 있습니다.






안전 모드로 시동을 하면 다음이 수행됩니다.


- 시동디스크를 확인하고 필요한 경우 디렉토리 문제 복구 시도


- 필요한 커널 확장 파일만 로드


- 시동 항목 및 로그인 항목이 자동으로 열리지 않도록 방지


- 사용자가 설치한 서체 비활성화


- 서체 캐시, 커널 캐시 및 기타 시스템 캐시 파일 삭제






안전 모드로 시동하면 사용할 수 없는 기능입니다.


- DVD 플레이어에서 동영상을 재생할 수 없습니다.


- iMovie 및 일부 다른 비디오 앱에서 비디오를 캡처할 수 없습니다.


- 일부 오디오 입력 또는 출력 기기가 작동하지 않을 수 있습니다.


- 일부 USB, FireWire 및 Thunderbolt 기기를 사용하지 못할 수 있습니다.


- 사용 중인 Mac 및 macOS 버전에 따라 Wi-Fi 네트워킹이 제한되거나 사용 불가능할 수 있습니다.


- VoiceOver와 같은 손쉬운 사용 기능이 예상대로 작동하지 않을 수 있습니다.


- 파일 공유 기능이 비활성화 됩니다.







안전 모드를 시동하는 방법입니다.


- Mac이 켜질때 'Shift' 키를 눌러서 시동합니다.


- 'Shift' 키가 없을 경우에는 터미널 명령어로 접근합니다.






켜질 때 'Shift'키를 눌러서 시동하면 애플 로고가 나온뒤 안전모드로 시동됩니다.








'Shift' 키가 없을 경우 터미널 명령어로 접근하는 방법입니다.


sudo nvram boot-args="-x"
cs

 명령어를 입력하고 재시동을 하면 안전모드로 시동됩니다.



sudo nvram boot-args="-x -v"
cs

명령어를 이볅하고 시동하면 상세 모드로 시동됩니다.


sudo nvram boot-args=""
cs


안전 모드를 마치고 정상 시동이 됩니다.






Apple의 지원시 안전 모드 시동을 자주 접하게 됩니다.


이렇게 Mac OS X 의 안전 모드 시동에 대해서 알아보았습니다.


728x90
반응형

'일상 리뷰 > Apple Mac' 카테고리의 다른 글

Mac OS X 복구모드  (3) 2019.03.05
Mac OS X 터미널 명령어로 초기화  (0) 2019.03.03
Mac OS X 디스크 이름 바꾸기  (2) 2019.03.03
일반 키보드 Mac OS 사용  (0) 2019.02.27
Mac Mini 공장초기화 방법  (0) 2019.02.26
728x90
반응형

Mac OS X 가 설치가 되어있는 맥을 중고로 구매하거나


선물로 받았을때 '무제', '무제1' 이런 식으로 디스크 명이 되어있을 때가 있습니다.


이름이 거슬려서 바꾸고 싶을때 쉽게 바꾸는 방법을 정리하겠습니다.







finder 의 좌측 메뉴에서 '응용 프로그램' 을 클릭한 뒤 'Launchpad' 


또는 하단 Dock에서 'Launchpad' 프로그램을 실행합니다.







'Launchpad' 를 실행하여 나온 프로그램중 '디스크 유틸리티' 프로그램을 실행합니다.






이같은 화면이 나오는데 시동디스크를 마우스 우클릭이나 


트랙패드를 두손가락으로 눌러줍니다.






나온 메뉴에서 '이름 변경' 을 클릭하거나 


우측 섹션에서 'MacSSD' 처럼 각 이름을 마우스로 클릭하면 변경할 수 있도록 활성화가 됩니다.






이렇게 활성화가 되어있을때 원하는 이름으로 변경 하면됩니다.






저는 기존 'MacSSD' 에서 'MacSSD1'로 변경해 보았습니다.


이렇게 디스크의 이름을 원하는 이름으로 쉽게 바꿀 수 있습니다.







728x90
반응형

+ Recent posts