簡體   English   中英

iPhone Interface Builder 中的自定義控件

[英]Custom Control in iPhone Interface Builder

這似乎是一個常見問題,但我沒有看到它得到清晰或簡潔的回答 - 因此我無法讓它發揮作用。

我在 Interface Builder 中創建了一個 Widget.xib 文件。 它包括:

View (UIView)
  ImageView (UIImageView)
  Button (UIButton)
  Label (UILabel)

我創建了 Widget.h 和 Widget.m,它們實現了 class Widget,它派生自 UIView。 在 Interface Builder 中,Widget.xib 的 File's Owner 設置為 Widget class。

Widget.h 看起來像這樣:

@interface IconView : UIView {
IBOutlet UIButton *widgetButton;
IBOutlet UILabel *widgetLabel;
IBOutlet UIView *widgetView;
IBOutlet UIImageView *widgetImage;
}

@property (nonatomic, retain) IBOutlet UIButton *widgetButton;
@property (nonatomic, retain) IBOutlet UILabel *widgetLabel;
@property (nonatomic, retain) IBOutlet UIView *widgetView;
@property (nonatomic, retain) IBOutlet UIImageView *widgetImage;

Widget.h 包括:

@synthesize widgetButton, widgetLabel, widgetView, widgetImage;

它的 dealloc 釋放了這四個對象。 在 Interface Builder 中,按鈕、label、視圖和 imageview 都連接到相應的 IBOutlets。

回到 Interface Builder,我從項目中打開了另一個 XIB。 這是 Playfield.xib。 這是一個更傳統的視圖,由 PlayfieldViewController.h 和.m 支持。 它包含:

View (UIView)
  ImageView (with a static graphic) (UIImageView)
  Button (UIButton)
  Widget
  Widget
  Widget

在 Playfield.h 中,我為按鈕和三個小部件創建了 IBOutlets。

@interface LinkViewController : UIViewController {
IBOutlet UIButton *buttonBack;
IBOutlet Widget *widget0;
IBOutlet Widget *widget1;
IBOutlet Widget *widget2;
}

@property (nonatomic, retain) IBOutlet Widget *widget0;
@property (nonatomic, retain) IBOutlet Widget *widget1;
@property (nonatomic, retain) IBOutlet Widget *widget2;
- (IBAction)buttonBackClicked:(id)sender;

這些也在 Playfield.h 中合成和發布。 在 Interface Builder 中,Playfield.xib 顯示了三個放置小部件的空矩形,這是我所期望的。 這些連接到 Playfield.h 中相應的 IBOutlets。

因此,此時我假設 go 一切就緒。 在 Playfield.m 的 viewDidLoad 中,我這樣做:

self.widget0.label.text = @"喂我";

在我看來,這引用了 Playfield.h 中聲明的 widget0 IBOutlet。 它連接到 Playfield.xib 中的第一個 Widget 項。 反過來,它在 Widget.xib 和 Widget.h 中有一個聲明的 label IBOutlet。 UILabel 有一個 Text 屬性。 所以它應該改變小部件內 label 上的文本。

但事實並非如此。 我究竟做錯了什么?

(我想強調一下,我不想制作一個 Interface Builder 插件。我知道這些很復雜。在 IB 中,我可以將我的小部件操作為空矩形。我還要注意我已經設置了背景Widget.xib 中小部件視圖的顏色為白色。當我運行項目時,我可以清楚地看到運動場圖形頂部的白色矩形,所以我知道小部件“在”那里。我似乎無法訪問它們。)

你在哪里調用了loadNibNamed:owner:options:方法來從你的 Widget.XIB 加載你的 Widget 子視圖?

此外,您確實將 Widget.XIB 文件中的視圖連接到文件所有者(這是一個 Widget 對象),因此連接了 IBOutlets 並允許您訪問視圖……但是您是否將視圖作為子視圖添加到您的 Widget?

當您嘗試使用self.widget0.label訪問它時,插座是否為零? 檢查self.widget0是否不nil (我猜它沒問題),但如果self.widget0.label也不nil (我想這是真正的問題)。 如果是這樣,您可能忘記為每個小部件視圖加載 Widget.xib。 如果不是,則可能意味着您擁有 label,但它沒有添加到視圖層次結構中。

您對 XIB 設置的描述沒有提到 Widget 上的label插座實際上連接到 XIB 中的 label。 檢查一下,也許? 聽起來好像您已經設置了所有其他內容,盡管您不需要在實例變量上聲明IBOutlet屬性,只需聲明屬性即可。

我經常錯過的一個常見問題是將 class 類型設置為 IB 中的小部件。

在 IB 中選擇的 Widget 類的屏幕截圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM