6244


ImageViewを円形にするためのサンプルコードについて分からないところがあります。  
引用先はこのページです。  
<http://ryutamaki.hatenablog.com/entry/2014/01/27/132020>

[code]

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        UIImage *circleImage = [UIImage imageNamed:@"ThaiNichi.png"];
        UIImageView *circleImageView = [[UIImageView alloc] initWithImage:circleImage];
    
        if (circleImage.size.width != circleImage.size.height) {
            CGFloat smallerSideLength = (circleImage.size.width < circleImage.size.height) ? circleImage.size.width : circleImage.size.height;
            circleImageView.frame = CGRectMake((circleImage.size.width - smallerSideLength) * 0.5f,
                                               (circleImage.size.height - smallerSideLength) * 0.5f,
                                               circleImage.size.width, circleImage.size.height);
        } else {
            circleImageView.frame = CGRectMake(0.0f, 0.0f, circleImage.size.width, circleImage.size.height);
        }
    
        circleImageView.layer.cornerRadius = circleImageView.frame.size.width * 0.5f;    
        circleImageView.clipsToBounds = YES;
        [self addSubview:circleImageView];
    
    }
    
[/code]

この中の一番下の行でエラーが出ます。エラーメッセージは  
「No visible @interface for '（このクラス名）' declares the selector 'addSubview:'」  
です。このエラーの解決方法をどなたかご教示いただけないでしょうか。  
以上、何卒よろしくお願いいたします。


CC BY-SA 3.0
2015-02-10T07:17:01.657
6243
2015-02-19T06:14:57.680
2015-02-10T07:32:49.360
7470
7470
question
objective-c iphone ios8 uiimage
UIImageViewを円形にする為のサンプルコードについて


> [self addSubview:circleImageView]

↓

[code]

    [self.view addSubview:circleImageView];
    
[/code]

注：行末のセミコロン（;）が抜けてます。

self（UIViewControllerのサブクラス）に、「addSubview:」というメソッドはありません。  
UIView（のサブクラス）にはあります。  
引用元には、UIViewControllerのサブクラスに実装するコードだとは、ひとことも書かれていませんね？

UIViewController（のサブクラス）には、かならずベースになるUIView（のサブクラス）が装備されていることを、忘れないようにしてください。UIViewControllerのプロパティ「view」がそれです。ともかく、あなたがプログラマとしてなんらかのプログラムを公開できるようになりたいと思うのなら、
**クラスリファレンスは、端から端まで目を通すようにしてください**
。その場で覚えきれないとか、理解しきれないとかであっても、いっかい目を通しているのといないのでは、のちのち大きな差になって現れてきます。  
（自分なりに「ネガティブ」ではあっても、質問者にとっては必要な意見（というかアドバイス）に編集させていただきました。）


CC BY-SA 3.0
2015-02-10T07:27:53.093
6244
2015-02-10T16:32:49.383
2015-02-10T16:32:49.383
7362
7362
6243
answer


> 「No visible @interface for '（このクラス名）' declares the selector 'addSubview:'」

上記エラーメッセージの意味は「このクラスの@interface部に`addSubview:`メソッドの宣言が見つ‌​からないよ」という感じです。

このようなエラーの場合はまず、示されたクラスの宣言部(普通は.hファイルの方)を確認してみるか、又は`addSubview:`メソッドの定‌​義を追うかすると良いです。  
xcodeの最新版を使用しているなら、コード上で **commandキー**
を押しながら`addSubview:`の文字列を選択すると定義されてい‌​る箇所(が見つかれば)を表示できます。  
私の環境ではこれでUIViewクラスの宣言部を表示できます。

つまり、selfが **UIViewクラスを継承していないため** このようなエラーが出ています。

なお、クラスの定義も上記方法で追えるので、自作のクラスの親クラスを追っていけばUIViewクラスを継承しているかどうかの確認ができます。

例:  
1.UIViewControllerを継承したHogeViewControllerの継承関係  
`HogeViewController -> UIViewController -> UIResponder -> NSObject`

2.UIViewの継承関係  
`UIView -> UIResponder -> NSObject`

上記2つの継承関係から、HogeViewControllerの実装部内のselfに対してUIViewクラスのメソッドは使えないことがわかります。(ここではselfがUIViewControllerのサブクラスのため)

それとは逆に、`alloc`や`init`などのメソッドが多くのクラスで使える理由は、Objective-
Cで使うほとんど全てのクラスが、それらのメソッドを定義しているNSObjectを継承しているためです。


CC BY-SA 3.0
2015-02-19T06:14:57.680
6734
2015-02-19T06:14:57.680
7364
6243
answer