2012-12-04 47 views
2

我使用的是使用页面编号来跟踪当前视图的BookController的类。目前,我正在按需创建每个视图控制器并以编程方式编写代码。我想访问我在故事板(厦门国际银行的文件)所创建的视图控制器,这样,当我需要一个新的页面,将访问我创建了一个二视图控制器。如何以编程方式调用viewcontroller在故事板中获取其视图?

// 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:@"[email protected]"]]; 
imageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
    imageView.center = CGPointMake(160.0f, 230.0f); 
[controller.view addSubview:imageView]; 


return controller; 
} 

只是不知道如何拨打电话来访问我创建了厦门国际银行文件,并使其进入第一页(页面= 0)。第二页(page = 1)是我如何以编程方式在书中绘制所有其他页面的示例。谢谢!

回答

2

记住故事板只是一个发钞银行它只是实例每个视图的层次结构和出口连接到拥有视图控制器的集合。您不想自己实例化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 

但为了连线起来,我不得不设置在主VC委托其我无法从故事板做到。当我在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

相关问题