2

我正在使用一个 BookController 类,它使用页码来跟踪当前视图。目前我正在按需创建每个视图控制器并以编程方式编写代码。我想访问我在 StoryBoard(xib 文件)中创建的视图控制器,这样当我需要一个新页面时,它将访问我创建的第二个视图控制器。

// 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)。第二页(page = 1)是我如何以编程方式绘制书中所有其他页面的示例。谢谢!

4

1 回答 1

2

请记住,Storyboard 只是 NIB 的集合,它们只是实例化每个视图的层次结构并将出口连接到拥有的视图控制器。您不想自己实例化 Storyboard 以创建单个视图控制器。这样做是在应用程序已经启动并使用不同的实例运行时创建新实例。即使您确实将它们连接起来,它们也会连接到冗余的实例,而不是您想要的实际实例。

我要做的是为您将单独使用的 SecondViewController 创建一个单独的 NIB 文件。然后你需要把它连接在一起。如果此代码在您需要访问的实例中,您只需将其传递给 SecondViewController 上的属性。或者,也许您只是传递值,但很可能您希望设置一个委托属性并为 SecondViewController 定义一个协议,以回调创建它的实例。

对于您的代码,您只需使用以下代码加载 NIB。

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

您只需要定义该委托以及可能需要将数据提供给新创建的视图控制器的任何属性。

下面是我最近使用 Storyboard 为 SideBar 界面创建的委托设置示例。我有一个位于 Home VC 中的 Header VC 的容器视图。这个 Header VC 可能就像您的 SecondViewController,因为我无法在 Storyboard 中连接它,所以我用代码完成了它。首先,我在 Header 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

但是为了把它连接起来,我必须从 Home VC 中设置委托,而我无法从 Storyboard 中做到这一点。当在 prepareForSegue 中触发嵌入 segue 时,我所做的是在 Home 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 回答