2016-10-25 9 views
1

나는 textField를 작성했으며 43/35와 같이 텍스트의 서식을 지정하려고합니다. 번호/번호 - 신용 카드 월 및 연도입니다.Swift. TextField의 형식 입력

숫자를 사용할 수도 있고 어떻게 더 쉽게 할 수 있습니까? 새로운 문자를 추가하고 2 번째 문자를 제거하면 3 번째 문자를 교체해야하는 문제가 있습니다. 내가 어떤 제 3 자 라이브러리를 사용하지 않을

, 나는이 내 현재의 솔루션입니다 기본 구현을

+1

그것은 숫자가 아니다 :

는 다음 코드의 끝에서 볼 수 있듯이 나는, 문자열 및 문자에 대한 몇 가지 확장을 만들어 마스크를 적용합니다. 사용자가 입력 할 때 또는 텍스트를 입력 한 후에 서식을 지정 하시겠습니까? – rmaddy

+0

음, 사용자 유형으로 입력하겠습니다. – user7065798

+0

어떻게 할 수 있습니까? – user7065798

답변

1

이 필요합니다. 기본적으로 다음을 수행해야합니다 나는의 ViewController에 구현 아래

1)

2) textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool 구현) 내 코드에 (어딘가에 textfielddelegate를 구현합니다. 숫자 형식이 작동하지 않도록

class ViewController: UIViewController { 
    @IBOutlet weak var textfield: UITextField! 

    let mask = "##/##" 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     textfield.delegate = self 
    } 
} 


extension ViewController: UITextFieldDelegate { 
    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
     guard let normalText = textField.text else { return false } 

     let beginning = textField.beginningOfDocument 
     // save cursor location 
     let cursorLocation = textField.positionFromPosition(beginning, offset: range.location + string.characters.count) 

     let newString = (normalText as NSString).stringByReplacingCharactersInRange(range, withString: string) 
     let newStringClean = newString.stringWithOnlyNumbers().withMask(mask) 

     guard newString != newStringClean else { return true } 

     textField.text = newStringClean 
     guard string != "" else { return false } 

     // fix cursor location after changing textfield.text 
     if let cL = cursorLocation { 
      let textRange = textField.textRangeFromPosition(cL, toPosition: cL) 
      textField.selectedTextRange = textRange 
     } 

     return false 
    } 
} 

extension String { 
    func stringWithOnlyNumbers() -> String { 
     return self.characters.reduce("") { (acc, c) -> String in 
      guard c.isDigit() else { return acc } 
      return "\(acc)\(c)" 
     } 
    } 

    func withMask(mask: String) -> String { 
     var resultString = String() 

     let chars = self.characters 
     let maskChars = mask.characters 

     var stringIndex = chars.startIndex 
     var maskIndex = mask.startIndex 

     while stringIndex < chars.endIndex && maskIndex < maskChars.endIndex { 
      if (maskChars[maskIndex] == "#") { 
       resultString.append(chars[stringIndex]) 
       stringIndex = stringIndex.successor() 
      } else { 
       resultString.append(maskChars[maskIndex]) 
      } 
      maskIndex = maskIndex.successor() 
     } 

     return resultString 
    } 

} 

extension Character { 
    func isDigit() -> Bool { 
     let s = String(self).unicodeScalars 
     let uni = s[s.startIndex] 

     let digits = NSCharacterSet.decimalDigitCharacterSet() 
     let isADigit = digits.longCharacterIsMember(uni.value) 

     return isADigit 
    } 
} 
+0

마지막 글자를 제거하고 3 글자 만 클릭하면 텍스트 필드에 글자가 하나 밖에 남지 않습니다. – user7065798

+0

수정 : 다시 작성한 값을 보호 문자열로 바꾸십시오! = ""else {return false} – user7065798

+0

tks @ user7065798! 나는 그것을 거기 고쳤다. – ghashi