TabBarViewController가 있으면 그냥 selectedIndex 값을 원하는 값으로 넣으면 된다. 없으면 생성해서 또 추가 해야하니 번거롭다. 


걍 간단하게 TabBarViewController를 따로 만들지 않고 간단하게 스토리보드를 사용하여 앱 실행시 열릴 디폴트 탭을 설정할 수 있다.


  1. 스토리 보드에서 Tab Bar Controller 선택
  2. Indentity Inspector 탭 선택
  3. User Defined Runtime Attributes 에서 + 클릭
  4. Key Path는 "selectedIndex" 로 입력
  5. Type은 "Number" 로 입력
  6. Value는 원하는 인덱스 값 입력 "1"


이렇게 설정을 하면 앱이 실행할 때 설정한 탭으로 열린다. 최종 위치값을 저장해서 열게 할려면 어차피 코딩 작업이 필요하긴 하다.



저작자 표시 비영리
신고
Posted by KraZYeom

난이도: 하

@available(iOS 5.0, *)
public var multipleSelectionBackgroundView: UIView?

public var selected: Bool // set selected state (title, image, background). default is NO. animated is NO

다중 선택과 체크마크가 필요해서 간단하게 구현하는 방법을 공유하겠다. 오래전에는 이것도 구현을 했었어야 했던 기억이 있는데 엄청 간단하게 바뀌었다.


우선 다중 선택이 가능하게 하기 위해서는 아래 처럼 코드 상으로 다중 선택을 활성화 하거나,

self.tableView!.multipleTouchEnabled = true

스토리보드의 TableView에서 select 부분을 Multiple Selection을 선택을 한다.


그리고 아래 코드처럼 간단하게 구현을 하면 된다.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
  // 1.
  cell.accessoryType = cell.selected ? .Checkmark : .None
  return cell
}

// 2.
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
  if let cell = tableView.cellForRowAtIndexPath(indexPath) {
    cell.accessoryType = .Checkmark
  }
}

// 3.
override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
  if let cell = tableView.cellForRowAtIndexPath(indexPath) {
    cell.accessoryType = .None
  }
}
  1. 현재 셀(cell)이 선택 되어 있으냐 아니냐에 따라서 체크 마크를 표시한다.
  2. 선택(select) 되었을 때는 체크 마크로 변경 한다.
  3. 선택 해제(Deselect) 되었을 때는 체크 마크를 제거 한다.




저작자 표시 비영리
신고
Posted by KraZYeom

난이도: 하


@available(iOS 8.0, *) DeviceOwnerAuthenticationWithBiometrics


@available(iOS 9.0, *) DeviceOwnerAuthentication


앱에 잠금을 하기 위해서 예전에는 직접 구현을 하거나 오픈소스를 가져다 쓰는 등으로 구현을 했었는데 iOS 8.0과 9.0에서 LocalAuthentication 라이브러리를 통해서 Touch ID와 Passcode를 지원하고 있다.


8.0에서는 Touch ID를 이용한 것만 지원하니 8.0에서 Passcode를 지원하려면 오픈소스를 가져다 쓰는게 좋긴하다.


Add Library

Project > Targets > Build Phases > Link Binary with Libraries > + > LocalAuthentication.framework 



사용방법

// 1.
if context.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthentication, error: &error) { 
// 2.
  context.evaluatePolicy(.DeviceOwnerAuthentication, localizedReason: "Authentication is required for access",
    reply: {
      (success: Bool, error) in
        if success {
          print("success")
        }
    }
  )
}
  1. 디바이스가 DeviceOwnerAuthentication을 지원하는지 검사한다. .DeviceOwnerAuthentication를 적용하면 Touch ID가 기본적용 되며, 실패시 PassCode를 입력 가능하다. 
  2. 지원을 하면 실행을 해서 한다. 성공 값이 Bool으로 반환된다. 


Passcode를 여러번 틀리면 알아서 1분 지연을 시켜준다. 그 이후에 또 실패를 하면 5분 등으로 추가적으로 시간이 더 지연된다.




저작자 표시 비영리
신고
Posted by KraZYeom


난이도: 하


오랜만에 iOS 코딩을 하려니 많은게 바뀌었다. 


UIAlertView는 9.0에서 아래와 같이 deprecated 되었고, UIAlertController를 사용하는 것을 권장한다.

@available(iOS, introduced=2.0, deprecated=9.0, message="UIAlertView is deprecated. Use UIAlertController with a preferredStyle of UIAlertControllerStyleAlert instead")


그리고 UIActionSheet도 UIAlertController를 사용하면 된다. 참고로 UIActionSheet는 아래와 같이 iOS 8.3에서 deprecated 되었다.

@available(iOS, introduced=2.0, deprecated=8.3, message="UIActionSheet is deprecated. Use UIAlertController with a preferredStyle of UIAlertControllerStyleActionSheet instead")


사용법

let alertController = UIAlertController(title: "Test Title", message: "Test Message", preferredStyle: UIAlertControllerStyle.Alert)
// .Alert .ActionSheet

let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default) { (UIAlertAction) -> Void in
  print("Okay")
}
alertController.addAction(okAction)

let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel) { (UIAlertAction) -> Void in
  print("cancel")
}
alertController.addAction(cancelAction)

let destructiveAction = UIAlertAction(title: "Destructive", style: UIAlertActionStyle.Destructive) { (UIAlertAction) -> Void in
  print("Destructive")

}
alertController.addAction(destructiveAction)

self.presentViewController(alertController, animated: true) { () -> Void in
  print("presentViewController")
}

Alert과 ActionSheet의 구분은 preferredStyle로 구분을 해주면 되고 나머지는 동일하다. 



Alert과 ActionSheet 공통으로 주의해야 할 점은 .Default와 .Destructive는 여러 개를 .addAction해서 추가 해도 되는데, .Cancel은 2개 이상 만들어서 self.presentViewController 하면 crash 된다.


UIAlertController를 만들고, 각각의 UIAlertAction을 추가해주면 된다. 워낙 간단하니 다른 설명은 하지 않도록 하겠다.



저작자 표시 비영리
신고
Posted by KraZYeom
TAG iOS 9


외국에서 물건을 구입하는 과정에서 결제만 되고 물건이 도착을 안하는 과정에서 문제가 생기면 딱히 소비자들이 할 수 있는 방법이 없다. 특히 언어적 문제로 인해 누군가 대신 처리를 해주면 좋은데 그 과정에서 가장 좋은게 신용카드 사에 있는 분쟁 신청. PayPal 에도 클레임/분쟁이라는게 있다. 


내가 직접 판매자와 연락을 해서 하는게 아니라 결제 회사가 대신 해준다. 이걸 진행 하려면 증거 자료가 필요하다. 약간의 스크린 캡쳐 등 물건을 구매 했다는 증거. 오더 넘버 등이 있으면 된다. 


최근 1년간 2건의 문제가 생겼었다. 


1. 타오바오

작년에는 타오바오에서 샤오미 체중계가 엄청 저렴해서 부서 사람들 몇 명과 함께 4대 금액을 결제를 했다. 문제는 결제가 되고 다음날 확인 하는 과정에서 패스워드를 몇 번 잘 못 입력하는 과정에서 계정이 멈춰 버렸다. 해결을 하기 위해서는 뭔가 신분 입증을 해야하는데 중국 회사 이기 때문에 언어적 문제 등 해결 기미가 안 보였다. 


gmail.com 으로 사용해서 그런지 결제, 오더 관련 정보는 메일로 전혀 오질 않았다. 아뿔싸. 배대지로 도착하기만을 기다렸으나 그것 마져도 도착하지 않았다. 아무런 정보가 없었기에 더더욱 힘들었다. 그리고 판매자도 뭔가 문제가 있어 보였다. 


약 7-8만원이라는 돈이 그냥 하늘로 날아갈 것 같았지만, 신한카드 사에 들어가 보니 물건을 잘 못 받거나, 아에 못 받거나 하는 등 문제가 생길경우 분쟁 신청을 대신 해주는 것이 있었다. 


원래 증거 같은것을 보여줘야 하는데, 딱히 증거가 없었기에 일단 일정한 양식에 의해서 입력을 했고 며칠 뒤에 신한카드에서 연락이 왔다. 진행을 해보겠지만 아무런 증거가 없기 때문에 못 받을 수도 있다라는 이야기도 했었다. 그리고 60일 이상 걸릴 수도 있다고 한다. 


신기하게 한달 이상이 지나고 나서 신한카드에서 연락이 와서 물건을 안보냈고 하면서 대금 회수가 되었다는 것이다. 그리고 며칠 뒤에 취소 결제가 승인 되었다. 


2. 테슬라

최근에 테슬라에서 아이폰 케이스를 팔아서 구입하는 과정에서 paypal으로 결제를 하는 과정에서 카드 승인은 떨어지고, 인증 과정에 문제가 생겼다는 alert 이 뜨면서 주문 완료 진행이 되질 않았다. 당연히 카드사에서 돈을 빼가지 않을 거라고 생각을 하고, 그냥 다른 카드로 일반 카드 결제를 진행했고 주문 완료 확정이 되었다. 


그리고 뭔가 예전에 경험이 있어서 일단 캡쳐를 했다. 테슬라 싸이트와 paypal 결제 관련 캡쳐. 그리고 바로 테슬라 고객센터 메일로 너희들 제대로 주문 진행 안되었으니 혹시나 결제 되었으면 결제 된거 취소 해달라고 했다. 


하지만 다음달에 돈을 빼갔다. paypal에 자세히 보니 2번의 결제 시도가 있었고 한번은 실패, 한번은 성공을 했다라는 로그가 있었다. 


젠장. 내돈 24만원. 


그리고 이전에 메일 보냈던 내용과 동일 하게 또 보냈다. 아무런 응답이 없다. 다른 분이 주문 과정에서 잘 못 된 문의를 했더나 얼마 지나지 않아서 답변을 받았다고 한다. 그래서 또 보냈다. 아무런 응답이 없다. 


그래서 paypal에 분쟁 신청에 가서 진행을 했다. 그리고 신한카드사에도 동시에 분쟁 신청을 진행을 했다. 


며칠이 지나도 paypal은 깜깜 무소식이다. 하지만 신한카드사는 적극적으로 나의 의견을 들어 주었다. 그리고 며칠 뒤에 paypal로 부터 분쟁 완료가 떴고 대금이 회수 되었다는 메세지를 받았다. 


paypal에서 처리한 분쟁이 성공한것인줄 알았는데 알고 보니 신한카드사에서 paypal로 클레임 건게 그게 먹혀 들었다 보다. 


일단 문제가 생기면 각종 증거자료를 캡쳐를 잘 해놔야 한다. 물건이 발송이 되어 버리면 판매자의 의견이 더 중요하게 작용하기 때문이다. 


아무튼 문제가 없는 즐거운 지름 되시길 바란다. 이상하게 꼬이면 적은 돈이라도 아까운데 큰돈이면 사람이 미친다. ㅠㅠ



저작자 표시 비영리
신고
Posted by KraZYeom