Frage

Ich habe eine benutzerdefinierten UIViewController und benutzerdefinierte UIView. Ich möchte die viewcontroller.view Eigenschaft außer Kraft zu setzen MyCustomUIView zurückzukehren.

Im Moment habe ich:

@interface MyViewController : UIViewController {    
    IBOutlet MyView* view;
}

@property (nonatomic, retain) IBOutlet MyView* view;

Dies kompiliert, aber ich erhalte eine Warnung: Eigenschaft ‚view‘ Typ nicht Superklasse ‚UIViewController‘ Objekttyp überein

.

Wie kann ich lindern diese Warnung?

War es hilfreich?

Lösung

Die kurze Antwort ist, dass Sie dies nicht tun. Der Grund dafür ist, dass die Eigenschaften sind wirklich nur Methoden, und wenn Sie den Rückgabetyp zu ändern, versuchen Sie diese:

  • (UIView *) Ansicht;
  • (MyView *) Ansicht;

Objective-C funktioniert nicht Rückgabetyp Kovarianz ermöglichen.

Was Sie tun können, ist eine neue Eigenschaft „myView“ hinzufügen, und machen es einfach die „Ansicht“ Eigenschaft typisieren. Dies wird Umwandlungen im gesamten Code lindern. Nur zuweisen zu der Ansicht Eigenschaft Ihrer Ansicht nach Unterklasse, und alles soll gut funktionieren.

Andere Tipps

@ lpaul7 posted bereits einen Link zu Travis Jeffery Blog als Kommentar, aber es ist so viel mehr richtig als alle anderen Antworten, dass es wirklich den Code muss eine Antwort auf sein:

ViewController.h:

@interface ViewController : UIViewController

@property (strong, nonatomic) UIScrollView *view;

@end

ViewController.m:

@implementation ViewController

@dynamic view;

- (void)loadView {
  self.view = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
}

@end

Wenn Sie eine xib, daß anstelle des überwiegenden loadView die Art Ihrer View-Controller-Sicht root ändern und IBOutlet der Eigenschaft hinzuzufügen.

Siehe Zwingende UIViewController anzeigen Eigenschaft, Done Right mehr Details.

Die Ansicht Eigenschaft / Methode des UIViewController Ihre Ansicht automatisch zurück. Ich glaube, Sie müssen nur das Ergebnis MyView werfen (oder nur den ID-Typen verwenden):

MyView *myView = (MyView*)controller.view;
id myView = controller.view;

Ich denke, der Code, den Sie oben geschrieben haben führen, dass Sie Schwierigkeiten. Sie wollen wahrscheinlich keine Aussicht Mitglied selbst erstellen (weil dann der Controller 2 Ansichten Speicher wird und möglicherweise nicht die richtigen intern verwenden) oder die Ansicht Eigenschaft außer Kraft setzen (weil UIViewController für sie eine besondere Behandlung hat.) (Siehe < a href = "https://stackoverflow.com/questions/640904/why-is-this-iphone-program-not-calling-loadview"> diese Frage für weitere Informationen über diese.)

Sorry, aber Ihre kurze Antwort ist falsch.

Die korrekte Umsetzung dieser wäre eine @property in die Header-Datei mit Ihrem Rückgabetyp hinzuzufügen. Dann statt @synthesize Sie die Getter und Setter manuell hinzufügen und einen gegossenen Typ Rückkehr aus [super Ansicht]

zum Beispiel meiner Klasse ist ein PlayerViewController

PlayerViewController.h

@property (strong, nonatomic) IBOutlet PlayerView *view;

PlayerViewController.m

- (PlayerView *)view{
    return (PlayerView*)[super view];
}
- (void)setView:(PlayerView *)view{
    [super setView:view];
}

das Wichtigste ist, die richtige Klasse in den Blick zu bringen.

Setzen eines UIView, wo ein PlayerView geht würde im Interface Builder wahrscheinlich funktionieren, aber nicht korrekt im Code funktionieren.

Ich bin derzeit mit dieser Implementierung.

Wenn jemand auf Swift ist 2.0+, Sie Protokollerweiterungen für eine wiederverwendbare Implementierung verwenden können:

// Classes conforming to this protocol...
protocol CustomViewProvider {

    typealias ViewType
}

// ... Will get customView accessor for free
extension CustomViewProvider where Self: UIViewController, Self.ViewType: UIView {

    var customView: Self.ViewType {
        return view as! Self.ViewType
    }
}


// Example:
extension HomeViewController: CustomViewProvider {
    typealias ViewType = HomeView
}

// Now, we can do something like
let customView: HomeView = HomeViewController().customView
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top