29

カスタムUIViewControllerとカスタムUIViewがあります。viewcontroller.viewプロパティをオーバーライドしてMyCustomUIViewを返したいのですが。

今私は持っています:

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

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

これはコンパイルされますが、警告が表示されます。プロパティ'view'タイプがスーパークラス'UIViewController'プロパティタイプと一致しません。

この警告を軽減するにはどうすればよいですか?

4

5 に答える 5

18

簡単な答えは、あなたはそうしないということです。その理由は、プロパティは実際には単なるメソッドであり、戻り値のタイプを変更しようとすると、次のようになります。

  • (UIView *)ビュー;
  • (MyView *)ビュー;

Objective-Cでは、リターンタイプの共分散は許可されていません。

できることは、新しいプロパティ「myView」を追加し、単に「view」プロパティを型キャストすることです。これにより、コード全体でタイプキャストが軽減されます。ビューサブクラスをviewプロパティに割り当てるだけで、すべてが正常に機能するはずです。

于 2009-03-14T19:48:22.027 に答える
4

UIViewControllerのビュープロパティ/メソッドは、ビューを自動的に返します。結果をMyViewにキャストする(またはidタイプを使用する)必要があると思います。

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

あなたが上に投稿したコードはあなたに問題を引き起こすと思います。ビューメンバーを自分で作成したくない場合(コントローラーが2つのビューを格納し、適切なビューを内部で使用しない可能性があるため)、またはビュープロパティをオーバーライドしたくない場合(UIViewControllerには特別な処理があるため)(これを参照してください)。後者の詳細については質問してください。)

于 2009-03-14T19:49:38.637 に答える
4

申し訳ありませんが、あなたの短い答えは間違っています。

これの正しい実装は、returntypeを使用してヘッダーファイルに@propertyを追加することです。次に、@ synthesizeの代わりに、ゲッターとセッターを手動で追加し、[スーパービュー]からキャストタイプを返します。

たとえば、私のクラスはPlayerViewControllerです

PlayerViewController.h

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

PlayerViewController.m

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

重要なことは、正しいクラスをビューに配置することです。

PlayerViewが配置される場所にUIViewを配置すると、Interface Builderで機能する可能性がありますが、コードでは正しく機能しません。

私は現在この実装を使用しています。

于 2012-04-25T22:35:23.657 に答える
0

誰かが Swift 2.0+ を使用している場合、再利用可能な実装のためにプロトコル拡張を使用できます。

// 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
于 2015-10-14T04:19:17.297 に答える