2

現在のビューを追跡するためにページ番号を使用している BookController クラスを使用しています。現在、各View Controllerをオンデマンドで作成し、コードをプログラムで記述しています。StoryBoard で作成したビュー コントローラー (xib ファイル) にアクセスして、新しいページを要求すると、作成した 2 番目のビュー コントローラーにアクセスできるようにしたいと考えています。

// Provide a view controller on demand for the given page number

- (id) viewControllerForPage: (int) pageNumber {

if ((pageNumber < 0) || (pageNumber > 31)) return nil;


if(pageNumber == 0){

      //here is where I want to access the entire xib file that the SecondViewController is connected with     
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
    SecondViewController *myVC = (SecondViewController *)[storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];

    myVC = [BookController rotatableViewController];

    return myVC;

     }
else if(pageNumber == 1){


// Establish a new controller
   UIViewController *controller = [BookController rotatableViewController];


// Add a text view
UITextView *textview = [[UITextView alloc] initWithFrame:(CGRect){.size = CGSizeMake(100.0f,100.0f)}];
textview.text = [NSString stringWithFormat:@"This is dedicated to people"];
textview.font = [UIFont fontWithName:@"Futura" size:18.0f];
textview.center = CGPointMake(475.0f, 700.0f);
[controller.view addSubview:textview];

     // Add a label
UILabel *textLabel = [[UILabel alloc] initWithFrame:(CGRect){.size = CGSizeMake(200.0f, 200.0f)}];
textLabel.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
textLabel.text = [NSString stringWithFormat:@"1"];
textLabel.font = [UIFont fontWithName:@"Futura" size:18.0f];
textLabel.center = CGPointMake(475.0f, 985.0f);
[controller.view addSubview:textLabel];


    // Add it as an image
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon@2x.png"]];
imageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    imageView.center = CGPointMake(160.0f, 230.0f);
[controller.view addSubview:imageView];


return controller;
}

私が作成したそのxibファイルにアクセスして最初のページ(page = 0)にするための呼び出しを行う方法がわからないだけです。2 番目のページ (ページ =1) は、本の他のすべてのページをプログラムで描画した方法の例です。ありがとう!

4

1 に答える 1

2

ストーリーボードは、各ビューの階層を単純にインスタンス化し、アウトレットを所有するビュー コントローラーに接続するだけの NIB のコレクションであることを思い出してください。ストーリーボードを自分でインスタンス化して、単一のビュー コントローラーを作成したくはありません。これは、アプリケーションがすでに起動されていて、別のインスタンスで実行されているときに、新しいインスタンスを作成することです。それらを配線したとしても、必要な実際のインスタンスではなく、冗長なインスタンスに配線されます。

代わりに、個別に使用する SecondViewController 用の個別の NIB ファイルを作成します。次に、それを一緒に配線する必要があります。このコードがアクセスする必要があるインスタンス内にある場合は、それを SecondViewController のプロパティに渡すだけです。または、単に値を渡すだけかもしれませんが、デリゲート プロパティを設定し、SecondViewController がそれを作成したインスタンスにコールバックするためのプロトコルを定義することをお勧めします。

コードについては、次のコードを使用して NIB をロードするだけです。

SecondViewController *vc = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
vc.delegate = self;

そのデリゲートと、新しく作成されたビュー コントローラーにデータを渡すために必要なプロパティを定義するだけです。

以下は、Storyboard を使用して SideBar インターフェイス用に最近作成したデリゲート セットアップの例です。ホーム VC にあるヘッダー VC のコンテナー ビューがあります。このヘッダー VC は、Storyboard で接続できなかったため、コードで接続したため、SecondViewController のようになる可能性があります。最初に、ヘッダー VC にデリゲート プロパティを作成しました。

@protocol IFHeaderDelegate;

@interface IFHeaderViewController : UIViewController

@property (nonatomic, assign) IBOutlet id<IFHeaderDelegate> delegate;

@end

@protocol IFHeaderDelegate <NSObject>

- (void)headerViewDidToggleSideBar:(IFHeaderViewController *)sender;

@end

次に、ボタンがタップされると、コールバックにデリゲートを使用します。(デリゲートが定義されていることを確認するために NSAssert を使用していることに注意してください。これは、見逃した場合に注意を喚起するためだけです。)

#import "IFHeaderViewController.h"

@interface IFHeaderViewController ()

@end

@implementation IFHeaderViewController

- (IBAction)siderBarButtonTapped:(id)sender {
    NSAssert(self.delegate != nil, @"Delegate must be defined!");

    if (self.delegate != nil) {
        [self.delegate headerViewDidToggleSideBar:self];
    }
}

@end

しかし、それを接続するために、ホーム VC からデリゲートを設定する必要がありましたが、ストーリーボードからは設定できませんでした。私がしたことは、prepareForSegue で埋め込みセグエが起動されたときにホーム VC に設定することでした。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
   DebugLog(@"segue.identifier: %@", segue.identifier);

   if ([@"HomeHeader" isEqualToString:segue.identifier]) {
       NSAssert([segue.destinationViewController isKindOfClass:[IFHeaderViewController class]], @"Destination VC must be the Header VC");
       IFHeaderViewController *headerVC = (IFHeaderViewController *)segue.destinationViewController;
       headerVC.delegate = self;
   }
}

完全なプロジェクトは GitHub にあります: https://github.com/brennanMKE/Interfaces/tree/master/SideBar

于 2012-12-30T04:35:50.923 に答える