2016-06-07 1 views
2

UIVIew의 모든 스타일을 정의하는 클래스가 있습니다. 그들은 모두 미리 정의되어 있지만 이것을 발사 할 때 확실하지 않습니다. 프로그래밍 방식으로 모든 UIView에 스타일을 적용하는 방법

나는 이것에 대한 확장을 만들려고

:

extension UIView 
{ 
    func willMoveToSuperview(newSuperview: UIView?) 
    { 
     self.stylize() // Another extension somewhere (not here my problem) 
    } 
} 

그리고이 오류를 받고 있어요는 :

Method 'willMoveToSuperview' with Objective-C selector conflicts with previews declaration with the same Objective-c selector

나는 그것을 무시하려고 노력하지만, 어느 일을하지 않았다.

모든 UIView가 표시 될 때 동일한 동작을 적용하는 방법에 대한 아이디어가 있습니까?

답변

0

Swift의 Extensions은 Objective-C의 Categories과 유사하지만 Swift에서는 허용하지 않습니다.

당신은 존재하지 override 수있는 기능 :

Extensions can add new functionality to a type, but they cannot override existing functionality.

출처 : Swift Extensions - Apple Documentation

는 당신이 스타일을하려고하는 것이 무엇인지에 따라, 당신은 UIAppearance를 살펴 할 수 있습니다, 그것은 당신에게 수 그 중에서도 UINavigationBar의 기본 색상을 사용합니다. NSHipster - UIAppearance

+0

그것은 그 간단하지 예를 들어 중첩 스타일을 지원하는 요소 willMoveToSuperview 이벤트를 잡아서 발사 할 수 있어야했습니다. 확장 일 필요는 없습니다. 나는 그것이 언제 눈에 보일지 알 수 없다. – Brduca

0

당신은 방법 .stylize()UIView의 서브 클래스를 만들 수 있습니다 NSHipster 그것에 대해 좋은 게시물을 가지고있다. 그러면 각 뷰를 만들고, 하위 클래스 UIView을 상속받습니다.

각 UIViewSubclass에서 .stylize()을 사용할 수 있습니다. 서브 클래스와 inherite 안에 스타일 코드를 작성하기 만하면됩니다.

또는

기존 UIView 클래스에 메소드를 추가 할 범주를 사용합니다.

참조 : 당신의 UIView의 기능을 사용자 정의 할 수 스위 즐링의 기술을 사용할 수 있습니다 https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html

+0

그게 내가 그것을 사용해야 할 때마다 내게 그것을 상속 강제로, 내 수업의 일부는 스토리 보드에 있습니다. – Brduca

+0

나는 2 가지 해결책을 주었다. 그리고 사실 항상 수업을 상속받는 것입니다. NSObject, UIView, UIViewCOntroller 등 UIView보다 MyStylizedView 폼을 상속 받아야합니다. –

+0

이 클래스는 스토리 보드에서만 만들면 클래스를 만들 필요가 없습니다. xcode에서 관리하므로 필요하지 않습니다. 그것을위한 클래스를 명시 적으로 생성합니다. 이 방법을 사용하면 스타일을 적용 할 수 있도록 (클래스가있는 모든 UIView에 대해) 강제로 적용 할 수 있습니다. – Brduca

0

답변을 드릴 때 (일반적으로 권장하지 않음) 또는 David의 대답에 따라 서브 클래 싱을 사용하면 클래스 및 해당 하위 클래스의 기존 메서드를 재정의 할 수있는 방법이 없습니다.

모든보기 대신보기 컨트롤러에 대한 기본 클래스를 만드는 것이 좋습니다. 뷰 컨트롤러 기본 클래스에서 viewWillLayoutSubviews을 재정 의하여 뷰 계층 구조를 반복하고 각 뷰에서 stylize을 호출 할 수 있습니다. 이것은 적은 수의 장소에서 하위 클래스 접근법을 사용한다는 것을 의미합니다 (모든보기와 대조적으로 컨트롤러보기).

하위 클래 싱 방식을 UIView와 함께 사용하는 경우 고려해야 할 또 다른 사항은 어쨌든 서브 클래 싱하는 경우 @IBDesignable 및 @IBInspectable 같은 것을 활용하여 UIView 하위 클래스를 스토리 보드 및 실시간 미리보기와보다 잘 통합 할 수 있다는 것입니다.

나는 정확히이 일을 신속 라이브러리를 쓰고, 당신이 원하는 것 스타일링의 유형에 대해 잘 작동 : 나는 스타일을 등록하고의 이름을 제공하기 위해 노력하고있어 https://github.com/daniel-hall/Stylish

관련 문제