2012-12-04 51 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

相關問題