30

ここにリンクされているサンプル コードはうまく機能し、UIScrollView がページング付きの画像を表示し、現在の画像の前後に画像をプレビューできるようにします。

再利用できる単一のコントロールに例をカプセル化しようとしています。そこで、PagingScrollView を作成しました。

@interface PagingScrollView : UIView {
    IBOutlet UIScrollView * scrollView;
}

@property (nonatomic,retain) IBOutlet UIScrollView * scrollView;

@end

汚れの簡単な実装

- (void) awakeFromNib
{
    [super awakeFromNib];

    NSLog(@"awake from nib");
}

PagingScrollView.xib では、元の ScrollViewPagingExampleViewController xib とまったく同じように、UIScrollView と ARScrollViewEnhancer を含むビューを配置しました。そのファイルの所有者のクラスは PagingScrollView に設定され、その scrollView アウトレットは子 UIScrollView に設定されます。

ScrollViewPagingExampleViewController では、次のように宣言するだけです。

IBOutlet PagingScrollView   *pagingScrollView;

IB では、View をドラッグし、そのクラスを PagingScrollView に設定し、その pagingScrollView アウトレットを PagingScrollView に接続します。

awakeFromNib では、scrollView プロパティは nil です。scrollView は同じ nib の IB に接続されているため、この時点で利用可能になると思います。

紛らわしいことに、ScrollViewPagingExampleViewController.xib には、scrollView という名前の空のアウトレットがあります。これは、PagingScrollView.xib で定義されているものとは異なる PagingScrollView のインスタンスがあることを示している可能性があります。

その結果、UIScrollView に実際の子ビューを設定できません。ここで何が間違っていますか?

4

4 に答える 4

12

ここにこの質問に対する非常に良い答えがあります: View in awakeFromNib にアクセスしますか?

簡単に言えば、ビューは awakeFromNib でロードされる可能性がありますが、そのコンテンツは遅延してロードされるため、達成しようとしているものには awakeFromNib の代わりに viewDidLoad を使用する必要があります。

于 2011-08-03T13:59:04.913 に答える
4

私はこの問題を抱えていましたが、あなたと同じように他の記事は当てはまりませんでした。独自のビューを持つViewControllerがありました。その ViewController の .xib ファイルにビューを配置し、CustomView のクラスを指定しました。CustomView が独自の .xib ファイルで定義されているという事実を除いて、これはうまく機能するため、自然に awakeFromNib ではすべての IBOutlets が nil でした。これは、インターフェイス ビルダーで .xib ファイルをリンクする方法がないためです。そのため、ViewController のビューが画面に表示されると、CustomView.xib ファイルをロードするのではなく、CustomView をインスタンス化しようとします。

ここに詳細な回避策がありますhttp://cocoanuts.mobi/2014/03/26/reusable/、しかし要点は、 CustomView クラスで次を実装する必要があったことです

@implementation CustomView

    - (id)awakeAfterUsingCoder:(NSCoder *)aDecoder
    {
        if (![self.subviews count])
        {
            NSBundle *mainBundle = [NSBundle mainBundle];
            NSArray *loadedViews = [mainBundle loadNibNamed:@"CustomView" owner:nil options:nil];
            return [loadedViews firstObject];
        }
        return self;
    }

@end
于 2015-06-21T20:55:30.817 に答える