IBOutlet을 사용하여 변수를 어떻게 서브클래싱합니까?
문제
내 특정 클래스의 모든 후손은 UILabel
인스턴스 변수.그래서 내 부모 수업에는 var label: UILabel
.하위 클래스에도 갖고 싶지만 IBOutlet
.어떻게 해야 하나요?
나는 IBOutlet
같은 이름이고 두 변수 선언 모두에 Weak을 추가했습니다.하지만 "저장된 속성으로 재정의할 수 없습니다"라는 오류가 발생합니다.
이 일을 어떻게 해야 할까요?그리고 서브클래싱을 위해 슈퍼클래스 버전을 인스턴스화할 필요가 없는 것이 가능합니까?
해결책
그냥 추가하세요 IBOutlet
슈퍼클래스의 수정자.
다른 팁
그렇게 함으로써 당신은 re-declaring
그만큼 label
하위 클래스의 속성. IBOutlet
인터페이스 빌더 작업을 위한 컴파일러 개념일 뿐입니다.
스위프트에서 저장된 속성 하위 클래스에서는 재정의하거나 다시 선언할 수 없습니다.상속만 가능합니다.
그러나 다음을 재정의할 수 있습니다. getter
그리고 setter
~의 properties
추가 검증이나 기능을 제공하기 위해 하위 클래스에 있습니다.Swift 가이드를 참조하세요. 우세하다 getter setter
다음을 사용하여 superClass에서 속성을 선언해야 합니다. IBOutlet
.
또는 하위 클래스에서 다른 속성을 만들 수 있습니다.또한 하위 클래스 중 하나(수퍼 클래스에는 다른 속성이 있을 수 있음)에 속성을 연결하고 이 구현을 슈퍼 클래스의 다른 하위 클래스에 제공하지 않는 경우에도 의미가 없습니다.
편집하다:설정할 수도 있습니다. label
두 개의 서로 다른 콘센트 viewControllers
당신의 SuperClass
당신이 준다면 스토리 보드에서 Subclasses
스토리보드의 이름을 다른 뷰 컨트롤러에 지정합니다.
그냥 정의하세요
class SuperClass{
@IBOutlet weak var label: UILabel! = nil
}
SubClass1
대표하다 view controller1
스토리보드에서 파생됨 SuperClass
SubClass2
다른 것을 표현하다 view controller2
스토리보드에서 파생됨 SuperClass
보다 Assistant Editor
그리고 열어 SuperClass
한쪽과 다른 쪽 view controller1
콘센트를 연결하고 SuperClass
에게 label
스토리보드에서 view controller1
.드래그 SuperClass
label
스토리보드에 view controller1
이제 다시 오픈 SuperClass
한쪽과 다른 쪽 view controller2
콘센트를 연결하고 SuperClass
에게 label
스토리보드에서 view controller2
.드래그 SuperClass
label
스토리보드에 view controller2
클릭하면 SuperClass
콘센트보다 다른 viewController에 연결된 두 개의 레이블이 표시됩니다.
짧은 대답은 다음과 같다는 데 동의했습니다.
"그냥 추가해
@IBOutlet
슈퍼클래스의 수정자입니다."
하지만 한 가지 참고 사항:ViewController를 노출할 경우 @IBOutlet
프레임워크(Carthage 포함)를 통해 정의된 경우 다음을 추가해야 합니다. public
변수 정의에 대한 속성입니다. 편집하다:대신에 open
액세스 키워드`.
뷰 컨트롤러가 있다고 가정 해 봅시다 CustomViewController 서브클래싱 UITableViewController, Carthage가 제공하는 프레임워크에서 빌드할 것입니다.소비자 애플리케이션에 액세스할 수 있어야 하는 모든 항목에는 태그가 지정되어야 합니다. public
:
public class CustomViewController: UIViewController {
override public func viewDidLoad() {
super.viewDidLoad()
}
@IBOutlet public var myBackgroundView: UIView!
@IBOutlet public weak var myLabel: UILabel!
이 접근 방식의 좋은 점은(그리고 저는 완전히 이 사용 사례의 온보드)는 인터페이스 빌더의 슈퍼클래스에서 IBOutlet 매핑을 수행한 다음 모든 매핑을 유지하면서 장면의 클래스를 하위 클래스로 전환할 수 있다는 것입니다.
예: 서브클래싱된CustomViewController
import UIKit
import mymodule
class SubclassedCustomViewController: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
myBackgroundView.backgroundColor = UIColor.blueColor()
myLabel.text = "My special subclass text"
}
이 질문이 오래 전에 게시되었다는 것을 알고 있지만 동일한 문제로 어려움을 겪고 마침내 해결책을 찾았기 때문에 결과를 계속 게시할 것이라고 생각했습니다...
나는 문제가 다음과 같다는 것을 이해합니다(적어도 그것이 내가 해결한 문제입니다).
클래스 A가 클래스 B에서 상속받도록 하는 방법은 무엇입니까? 각 클래스는 몇 가지 공통 IBOutlet 속성을 가진 자체 XIB 파일을 갖습니다. 목표는 슈퍼 클래스가 하위 클래스에 공통적인 IBOutlet과 관련된 작업을 처리하도록 하는 동시에 Interface Builder를 사용하여 하위 클래스에 대한 인터페이스를 디자인할 수 있도록 하는 것입니다.*
그렇게 하려면:
- 슈퍼 클래스의 XIB 파일에서 슈퍼 클래스에서 iBoutlet 연결을 만듭니다.
- 하위 클래스의 XIB 파일의 서브 클래스에서 iBoutlet 연결을 상속하는 데 필요한 슈퍼 클래스와 동일한 iBoutlet 속성 이름을 사용하십시오.
- 서브클래스에서 IBOutlet 변수 선언을 삭제합니다.