2013-04-11 75 views
0

我試圖做一些不同的事情,混合XIB和STORYBOARD。我的主要目標是爲我的應用程序創建一個複雜的STORYBOARD,並使用XIB查看比iPhone更大的視圖,例如iPhone上的Settings應用程序。如何在同一個ViewController(在故事板上創建)之間切換兩個視圖(在xib上創建)?

作爲一個簡單的例子,我使用xib接口創建了兩個類視圖view1和view2。每個人都會執行簡單的任務,比如顯示許多標籤「Hello World - View 1」和「Hello World - View 2」,直到覆蓋正常iPhone屏幕的兩倍。爲此,將XIB上的視圖設置爲「FreeForm」的大小,並在視圖中放置了6個標籤。 h和.M被寫成文件:它,我創建了一個視圖控制器後

View.h

#import <UIKit/UIKit.h> 

@interface View1 : UIView { 
    UIView *view; 

    UILabel *lab1; 
    UILabel *lab2; 
    UILabel *lab3; 
    UILabel *lab4; 
    UILabel *lab5; 
    UILabel *lab6; 
} 
@property (nonatomic, retain) IBOutlet UIView *view; 
@property (retain, nonatomic) IBOutlet UILabel *lab1; 
@property (retain, nonatomic) IBOutlet UILabel *lab2; 
@property (retain, nonatomic) IBOutlet UILabel *lab3; 
@property (retain, nonatomic) IBOutlet UILabel *lab4; 
@property (retain, nonatomic) IBOutlet UILabel *lab5; 
@property (retain, nonatomic) IBOutlet UILabel *lab6; 
@end 

View.m

#import "View1.h" 

@implementation View1 
@synthesize view, lab1, lab2, lab3, lab4, lab5, lab6; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     [[NSBundle mainBundle] loadNibNamed:@"View1" owner:self options:nil]; 
     [self addSubview:self.view]; 
    } 
    return self; 
} 
- (void) awakeFromNib 
{ 
    [super awakeFromNib];  
    [self addSubview:self.view]; 
} 
@end 

稱爲myViewController用故事板,並把視圖內的滾動視圖。 .H和.M可以看到下面的代碼:

ViewController.h

#import <UIKit/UIKit.h> 
@class View1, View2; 

@interface ViewController : UIViewController { 
    View1 *viewXIB1; 
    View2 *viewXIB2; 
} 
@property (weak, nonatomic) IBOutlet UIScrollView *myScrollView; 
- (IBAction)changeView1:(id)sender; 
- (IBAction)changeView2:(id)sender; 
@end 

ViewController.m

#import "ViewController.h" 
#import "View1.h" 
#import "View2.h" 

@interface ViewController() 
@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.myScrollView.contentSize=CGSizeMake(320,755);  
    viewXIB1 = [[View1 alloc] initWithFrame:CGRectMake(0, 0, 320, 755)]; 
    viewXIB2 = [[View2 alloc] initWithFrame:CGRectMake(0, 0, 320, 755)]; 
    [self.myScrollView addSubview:viewXIB1]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 

- (IBAction)changeView1:(id)sender { 
    [self.myScrollView addSubview:viewXIB1]; 
    [self.myScrollView setNeedsLayout];  
    [self.view reloadInputViews]; 
    [self reloadInputViews]; 
} 

- (IBAction)changeView2:(id)sender { 
    [self.myScrollView addSubview:viewXIB2]; 
    [self.myScrollView setNeedsLayout]; 
} 
@end 

的問題是,有對代碼沒有任何警告或錯誤,但不起作用。 這段代碼有什麼問題?有人能幫我嗎?

回答

0

有一點是錯誤的是,你永遠不會刪除任何意見。更換

第一IBAction

- (IBAction)changeView1:(id)sender { 
    if (![self.myScrollView.subviews containsObject:viewXIB1]) { 
     [viewXIB2 removeFromSuperView]; 
     [self.myScrollView addSubview:viewXIB1]; 
     [self.myScrollView setNeedsLayout];  
     [self.view reloadInputViews]; 
     [self reloadInputViews]; 
    } 
} 

和模擬第二IBAction

- (IBAction)changeView2:(id)sender { 
    if (![self.myScrollView.subviews containsObject:viewXIB2]) { 
     [viewXIB1 removeFromSuperView]; 
     [self.myScrollView addSubview:viewXIB2]; 
     [self.myScrollView setNeedsLayout]; 
    } 
} 

而且,您的自定義視圖的初始化代碼,應該包含這樣的like.-

UIView *newView = [[[NSBundle mainBundle] loadNibNamed:@"View1" owner:self options:nil] objectAtIndex:0]; 
[self.view addSubview:newView]; 
+0

觀察到@ssantos,但該應用程序仍然無法正常工作。按鈕也接收Touch和滾動視圖,但滾動視圖內沒有任何內容。奇怪的是,作爲標籤的View1和View2(lab1,lab2 ... lab6)上創建的即時變量看起來不會加載XIB上的內容,因爲當我嘗試使用命令行查看其內容時:「( lldb)po lab1「返回爲」$ 0 = 0x00000000 「。也許還有一些問題。 – 2013-04-12 13:08:00

+0

很難說正在發生什麼,但進一步查看你的代碼,這條線沒有任何意義'[self.view addSubview:self.view];'。我會編輯我的回答 – ssantos 2013-04-12 15:38:13

+0

很棒的@ssantos。這是我發現的兩個問題之一,正確的代碼是[self addSubview:self.view]。第二個問題是我忘記爲我的文件所有者設置自定義類的「類」。現在我的應用程序工作得很好!非常感謝,解決了我的問題。 – 2013-04-12 15:55:08