2017-05-22 3 views
0

저는 Swift를 배우는 중이며 UITextView에 자리 표시자를 추가하는 확장 프로그램을 만들려고합니다.저장된 속성이있는 확장자

내 생각은 2 개의 UITextView를 작성하는 것입니다. 하나는 텍스트를 자리 표시 자로 만들고, 사용자가 텍스트 편집을 시작하면 실제로 숨겨지고 다른 사용자는 다른 UITextView를 수정합니다.

그러나 여기서 나의 질문은 UITextView에서 자리 표시자를 갖는 것이 아니라이 문제를 해결하는 방법을 사용하는 방법에 관한 것입니다.
내 질문은 내가 같이 발신자 측에서 볼 것 확장 만들 내 구현을 변경해야하는 일입니다 : 지금까지
myTextView.placeholder("a placeholder text..")

을, 나는 나의의 UIViewController에서 그것을 창조하고 필요로했다 확장 기능으로 이동하려면 저장 속성이 많아서 작동하지 않습니다. 여기

내 코드입니다 :

import UIKit 

class ViewController: UIViewController, UITextViewDelegate { 


    let myTextView: UITextView = { 
     let textView = UITextView() 
     textView.tag = 0 
     textView.backgroundColor = UIColor.yellow 
     textView.layer.cornerRadius = 8 
     textView.translatesAutoresizingMaskIntoConstraints = false 
     return textView 
    }() 

    let textViewPlaceHolder: UITextView = { 
     let textViewPlaceHolder = UITextView() 
     textViewPlaceHolder.tag = 1 
     textViewPlaceHolder.text = "Placeholder text.." 
     textViewPlaceHolder.textColor = UIColor.lightGray 
     textViewPlaceHolder.backgroundColor = UIColor.clear 
     textViewPlaceHolder.translatesAutoresizingMaskIntoConstraints = false 
     return textViewPlaceHolder 
    }() 


    func textViewDidChange(_ textView: UITextView) { 
     myTextView.becomeFirstResponder() 
     if textView.tag == 1 && (myTextView.text != nil || myTextView.text != "") { 
      textView.isHidden = true 
      textViewPlaceHolder.resignFirstResponder() 
     } else if textView.tag == 0 { 
      if myTextView.text == nil || myTextView.text == "" { 
       textViewPlaceHolder.becomeFirstResponder() 
       myTextView.resignFirstResponder() 
       textViewPlaceHolder.isHidden = false 
       textViewPlaceHolder.text = "Placeholder text.." 

      } 
     } 
    } 

    func textViewDidBeginEditing(_ textView: UITextView) { 
     DispatchQueue.main.async { 
      self.textViewPlaceHolder.selectedRange = NSMakeRange(0, 0) 
     } 
    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.backgroundColor = UIColor.lightGray 
     view.addSubview(myTextView) 
     textViewConstraints() 
     view.addSubview(textViewPlaceHolder) 
     myTextViewPHConstraints() 

     myTextView.delegate = self 
     textViewPlaceHolder.delegate = self 

    } 

    func textViewConstraints() { 
     myTextView.widthAnchor.constraint(equalTo: self.view.widthAnchor, constant: -16).isActive = true 
     myTextView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true 
     myTextView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true 
     myTextView.heightAnchor.constraint(equalToConstant: 200).isActive = true 
    } 

    func myTextViewPHConstraints() { 
     textViewPlaceHolder.widthAnchor.constraint(equalTo: self.view.widthAnchor, constant: -16).isActive = true 
     textViewPlaceHolder.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true 
     textViewPlaceHolder.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true 
     textViewPlaceHolder.heightAnchor.constraint(equalToConstant: 200).isActive = true 
    } 

} 

내가 위에서 언급 한 바와 같이, 나는 아직도 스위프트을 배우고,이 질문은 매우 구체적인 문제를 해결하기 위해, 그것보다 더하지 않습니다, 해결하는 방법은 의미있어 신속한 확장 문제.

참고 : 위의 코드를 사용하여 자리 표시 자 문제를 해결하는 것은 완벽하지 않으므로 사용하지 마십시오.

+1

확인이 https://stackoverflow.com/questions/25426780/how-to-have-stored-properties-in-swift-the-same- 방법 -i-had-on-objective-c – commando24

답변

1

당신은 같은 것을 수행 할 수 있습니다

extension UITextView { 

    private struct AssociatedKeys { 
     struct var placeholder = "placeholder" 
    } 

    var placeholder: String! { 
     get { 
      guard let placeholder = objc_getAssociatedObject(self, &AssociatedKeys.placeholder) as? String else { 
       return String() 
      } 

      return placeholder 
     } 

     set(value) { 
      objc_setAssociatedObject(self, &AssociatedKeys.placeholder, value, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     } 
    } 
}