2013-12-09 35 views
1

這是我第一次發佈在StackOverflow上 - 一直拉我的頭髮在這一個太長。希望這裏的社區能夠提供幫助。無法訪問和設置文本的UILabel以編程方式加載XIB

我已經設置了UIScrollView/PageControl來翻頁4頁。我試圖將.xib加載到ScrollView中4次,每次都使用不同的文本和圖像。

不幸的是,我可以加載xib,但無法更改文本/圖像,我不知道爲什麼。我認爲這可能與無法訪問我的ViewController中加載的NIB的UILabel有關。

這裏的CardView.xib(CardView.h)的.h文件:

#import <UIKit/UIKit.h> 

@interface BMTutorialCardView : UIView 

@property (strong, nonatomic) IBOutlet UIView *contentView; 
@property (weak, nonatomic) IBOutlet UIImageView *cardImage; 
@property (weak, nonatomic) IBOutlet UILabel *cardLabel; 

@end 

而這裏的CardView.m文件:

#import "CardView.h" 

@implementation CardView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     UIView *xibView = [[[NSBundle mainBundle] loadNibNamed:@"BMTutorialCardView" owner:self options:nil] objectAtIndex:0]; 
     [self addSubview:xibView]; 
    } 
    return self; 
} 
@end 

我迷上了的UIImageView和雙方的UILabel從xib到CardView.h的網點。

現在,在我的ViewController,我4次添加到廈門國際銀行滾動視圖我:

@implementation BMViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    for (int i = 0; i < 4; i++) { 
     CGRect frame; 
     frame.origin.x = self.scrollView.frame.size.width * i; 
     frame.origin.y = 0; 
     frame.size = self.scrollView.frame.size; 

     CardView *subview = [[BMTutorialCardView alloc] initWithFrame:frame]; 

     //The following line doesn't change the text. 
     subview.cardLabel.text = @"This line doesn't change the text on the label"; 
     [self.scrollView addSubview:subview]; 
    } 

    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * 4, self.scrollView.frame.size.height); 
} 

我不知道爲什麼subview.cardLabel.text實際上不會更改文本。看起來像subview.cardLabel是零,但我清楚地看到UILabel與iOS模擬器運行時在xib中的默認文本。

+0

不知道答案,但'@implementation CardView'看起來很奇怪。 'CardView'和'BMTutorialCardView'應該如何關聯? –

+0

抱歉 - 錯誤的複製和粘貼。他們是一樣的東西。感謝所有的幫助,讓它工作。看起來這是另一個視圖問題的觀點。 – user3081257

回答

0

替換這些2線:

UIView *xibView = [[[NSBundle mainBundle] loadNibNamed:@"BMTutorialCardView" owner:self options:nil] objectAtIndex:0]; 
[self addSubview:xibView]; 

有了這個:

self = [[[NSBundle mainBundle] loadNibNamed:@"CardView" owner:self options:nil] objectAtIndex:0]; 
self.frame = frame; 

我不認爲這是最好的解決方案,但它應該適用於您的情況,而不必更改太多。

...正如其他人已經說過的,你需要檢查你的班級名稱(BMTutorialCardView vs CardView)。

編輯:

我想我更喜歡this approach。請確保將您的筆尖文件中的文件所有者更改爲UIViewController,並將其view插座連接到您的CardView(或任何您的UIView子類稱爲)。

然後你就可以刪除這不是在你的initWithFrame:方法工作完全代碼,並在替換這一行你viewDidLoad

CardView *subview = [[BMTutorialCardView alloc] initWithFrame:frame]; 

有了這個:

UIViewController *controller = [[UIViewController alloc] initWithNibName:@"CardView" bundle:nil]; 
CardView *subview = (CardView *)controller.view; 
subview.frame = frame; 
0

OK,假設你已經創建的界面生成器的廈門國際銀行和鏈接的IBOutlets,我覺得這些線在initWithFrame

UIView *xibView = [[[NSBundle mainBundle] loadNibNamed:@"BMTutorialCardView" owner:self options:nil] objectAtIndex:0]; 
[self addSubview:xibView]; 

基本上是在您的視圖的頂部,這樣雖然你創建一個視圖」重新更改界面中創建的標籤,由於您已將所有重複視圖重疊在一起,因此無法看到更改。嘗試拿出我上面引用的線。編輯:另外,就像Phillip指出的那樣,爲什麼CardView.h會說「BMTutorialCardView」,並且爲什麼在.m和文件名稱中的所有內容都會顯示「CardView」時,用「BMTutorialCardView」xib初始化視圖? ?有兩個單獨的課程讓你感到困惑嗎?其實,更多的我看你的代碼,越糊塗我得到你想要做什麼......

0

約的問題可以通過View Life Cycle。假設我們有單獨的視圖插圖Beer.xibBeer.class(其中從.xib視圖中的子視圖在類實現中存儲在那裏,存儲爲@IBOutlets)。最後,我們有BeerInfoViewController.swift(由UIViewController繼承)。首先,我們需要的.xib加載到我們的BeerInfoViewController(我很抱歉Swift,我太年輕了Objective-C):

override func viewDidLoad() { 
    super.viewDidLoad() 
    guard let beerXib = Bundle.main.loadNibNamed("Beer", owner: self, options: nil)?.first as? BeerInfoViewController else { 
     fatalError("Beer.xib is not found. ❌") 
    } 
    beerXib.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height) 
    self.view.addSubView(beerXib) 
} 

好吧,Beer.xibBeerInfoViewController的根查看加載。接下來,您需要訪問位於Beer.class@IBOutlets不再多說

beerXib.subviews.forEach { subView in 
    // Do whatever you want to do with subviews! 
} 

哎呀。不要忘記在故事板中爲你定義一個班級.xib!你要做的是在身份檢查,或只是在Xcode中鍵入cmd + option + 3默認..

相關問題