문제

내 특정 클래스의 모든 후손은 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

enter image description here

이제 다시 오픈 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 변수 선언을 삭제합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top