2017-03-27 3 views
0

저는 프로젝트의 모든 버튼 모양을 제어하려고했습니다. Extension을 만들고 하나의 ViewController 파일의 맨 위에 배치하여 해당 뷰의 모든 버튼 모양을 제어합니다. 그것은 위대한 작품. 여기에 있습니다 :전 세계적으로 버튼 모양 제어

import UIKit 

    // EXTENSION TO CONTROL BUTTON APPEARANCE 
    extension UIButton { 
     func styleButton() { 
      self.layer.cornerRadius = 8 
      self.layer.borderWidth = 2 
      self.layer.borderColor = UIColor.red.cgColor 
     } 
    } 

    class DefaultSettingsVC: UIViewController, UITextFieldDelegate { 
    ... 
    // IN VIEWDIDLOAD : 
     myButton1.styleButton() 
     myButton2.styleButton() //etc. 

유일하게 모든 ViewController 파일의 맨 위에 넣어야합니다. (나는 여기서 올바른 용어를 사용하기를 희망한다.) 그래서 대신에 UIButton의 서브 클래스 인 완전히 새로운 파일을 만들 것이라고 생각했다. 다음은 전체 파일의 내용입니다.

import UIKit 

class ButtonStyle: UIButton { 
    func styleButton() { 
     self.layer.cornerRadius = 8 
     self.layer.borderWidth = 2 
     self.layer.borderColor = UIColor.red.cgColor 
    } 
} 

하지만 지금은 무엇입니까? 내 ViewController 파일의 클래스 줄에 추가하려고하면 "클래스에서 다중 상속"오류가 발생합니다.

class DefaultSettingsVC: UIViewController, UITextFieldDelegate, ButtonStyle { 

나는 완전히 잘못된 트랙에 있습니까? 내가 완전히 다른 방식으로해야할까요? 어떤 도움이라도 좋을 것입니다. 내 스위프트 전문 지식은 5 점 만점에 2.5 점이므로 여전히 배우고 있으며 가능한 경우 몇 가지 지침에 감사 할 것입니다.

+0

암시 적으로'styleButton()'을 적용해야하는 하위 클래스를 만들고 싶다는 것입니다. –

+0

나는 그렇게 생각한다. 그러나 그것이 그것이 올바른 방법인지 확실하지 않습니다. – Jupiter869

+0

질문에 답하기 전에 무엇을 달성하고자하는지 정확히 알 수 있습니까? 그래서 나는 유용한 접근법을 제안 할 수있다. –

답변

2

이렇게하려면 선명하지 않아야합니다. 확장 프로그램은 갈 길이 멀다! 다른 클래스에서 확장을 사용할 수있게하려면 분리 된 파일에 넣어야합니다. UIButton 클래스를 확장하고 있으므로 모든 곳에서 액세스 할 수 있기를 원합니다.

참조 ViewController 클래스 :

class MyViewController: UIViewController { 

    var button = UIButton() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     button.styleButton(cornerRadius: 8, borderWidth: 2, borderColor: UIColor.red.cgColor) 
    } 
} 

그리고 당신의 확장 파일 :

extension UIButton { 
    func styleButton(cornerRadius: CGFloat, borderWidth: CGFloat, borderColor: CGColor) { 
     self.layer.cornerRadius = cornerRadius 
     self.layer.borderWidth = borderWidth 
     self.layer.borderColor = borderColor 
    } 
} 

나는 당신이 경우에 당신이 원하는 매개 변수를 설정할 수있어 그래서 지금 그것을 조금 불통 당신 나중에 다른 버튼의 스타일을 지정해야합니다. 그것은 내 의견으로는 더 재사용이 가능하므로 더 유용합니다.

+0

이것은 훌륭하게 작동합니다! 고마워요! (나는 내 ​​ViewController 파일의 어딘가에 버튼 확장 파일을 식별 할 필요가 없다는 사실에 놀랐다. 그냥 알 것 같다.) 큰 도움, 고마워! – Jupiter869

+0

당신을 환영합니다! 그것이 확장 기능에 대해 대단한 것입니다. 'UIKit'의'UIButton' 클래스를 확장하고 있으므로'UIButton'을 만들 때마다 확장 기능의 메서드와 변수를 사용할 수 있습니다. – raphh

0

나는 모든 ViewControllers의 모든 버튼에 원하는 스타일을 적용하는 것이 좋습니다 것입니다 :

  • 는 응용 프로그램에서 ViewControllers의 모든 사용자 정의 UIViewController 슈퍼 클래스를 만듭니다.

  • 슈퍼 클래스가보기에있는 모든 버튼에 대해 원하는 스타일을 적용하도록합니다.

슈퍼 클래스는 비슷해야합니다

class BaseViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     setupButtonsStyle() 
    } 

    func setupButtonsStyle() { 
     for subview in view.allSubViews.filter({$0 is UIButton}) { 
      let button = subview as! UIButton 
      button.layer.cornerRadius = 8 
      button.layer.borderWidth = 2 
      button.layer.borderColor = UIColor.red.cgColor 
     } 
    } 
} 

extension UIView { 
    var allSubViews : [UIView] { 
     var array = [self.subviews].flatMap {$0} 
     array.forEach { array.append(contentsOf: $0.allSubViews) } 

     return array 
    } 
} 

allSubViews 선언의 목적은 뷰의 모든보기와 그 하위 뷰를 얻을 수입니다.

하위 클래스 (들)이 viewDidLoad() 방법은 super.viewDidLoad() 포함되어 있는지 확인하십시오

class ViewController: BaseViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 

이 방법을 응용 프로그램에서 각각 하나의 버튼의 스타일 메소드를 호출 시간 (당신이 호출 할 필요가 없습니다 저장 button.styleButton을 각 버튼에 대해 수동으로) 원하는 ViewController를 수퍼 클래스의 하위 클래스로 지정하기 만하면됩니다.

희망이 도움이되었습니다.

+0

감사합니다! 이것은 아주 좋은 해결책입니다. 각 버튼의 스타일을 호출 할 필요가 없습니다. 감사!! :) – Jupiter869

관련 문제