2011-02-23 74 views
16

我在設計使用IB一個特定的按鈕(帶有一些標籤,以及imageView和其他東西)。在另一個xib中使用xib對象

我想然後在另一個xib中使用該xib對象(按鈕),其中我有該按鈕的6個對象。

我知道我可以使用類標識符以編程方式做到這一點,但我必須定位我的標籤和圖像視圖,並在代碼中設置默認值和其他一切。

我想知道是否有可能使用IB來做同樣的事情? (當然我仍然會在代碼中設置的值,但我要的標貼/ ImageView的和所有其餘的位置在廈門國際銀行進行設置)

感謝

編輯

所以,我明白我最初要求的是不可能的。 我現在想要的是這樣的:

我創建了一個ButtonTest.xib。 Xib內部我有一個UIView和3個子視圖(2個標籤和一個按鈕)。 在檢查員中,我將UIView類設置爲ButtonTest。 Inside ButtonTest.m我有3個插座,用於連接IB的每個子視圖。

接下來我有ButtonTestViewController.xib。 在裏面我放了一個視圖,並在檢查器中設置它的類爲ButtonTest。 我該視圖連接到myTextView插座內ButtonTestViewController.mButtonTest

的現在,這是ButtonTestViewController.m的viewDidLoad裏面的代碼:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"ButtonTest" owner:nil options:nil]; 
    ButtonTest *mainView = (ButtonTest*)[subviewArray objectAtIndex:0]; 

    self.myTextView = mainView; 
} 

我希望會發生,是在ButtonTestViewController視圖。 xib將成爲我在ButtonTest.xib中設計的視圖。 這只是沒有發生。會發生什麼情況是ButtonTestViewController.xib中的視圖保持不變。

值得一提的是,如果我補充一下:

[self.view addSubview:mainView]; 

它確實增加了新的觀點,除了現有的。

任何想法如何做我想要的?

最終我想在ButtonTestViewController.xib中看到6個視圖,它們都將看起來像ButtonTest.xib模板,並且標籤值將在代碼中進行設置。你說

EDIT2

好吧,夥計們我所做的一切和它的工作就像一個魅力。 我現在遇到的這個問題唯一的問題是當ButtonTestViewController.xib中的視圖稍大時,然後在ButtonTest.xib中查看。 發生這種情況時,按鈕上的標籤看起來非常模糊。 當他們都是相同的大小,這一切都很好。

@ NED - 我用你在我的initWithCoder方法發佈確切的代碼,但我換幀一句話是:

self.bounds = mainView.frame; 

我試着在IB與內容模式下播放試圖修復它,徒勞無功。

當我使用它就像你貼,意思是:

mainView.frame = self.bounds; 

它不工作,而這兩種觀點大小保持不變。 在這裏,我嘗試玩resizeMask,但仍然沒有工作。

和想法如何解決這兩個問題? 謝謝你們!

編輯3

我還是設法解決的問題之一,調整的ButtonTestViewController.xibButtonTest.xib視圖大小。 這是我做了什麼(使用代碼來解決模糊問題,從here拍攝)

self.bounds = CGRectMake(0, 0, mainView.frame.size.width, mainView.frame.size.height); 
     CGRect overlay2Frame = self.frame; 
     overlay2Frame.origin.x = round(overlay2Frame.origin.x); 
     overlay2Frame.origin.y = round(overlay2Frame.origin.y); 
     self.frame = overlay2Frame; 

的另一個問題我還是解決不了。 ButtonTest.xib中的視圖不會變大以匹配其他視圖。

回答

15

你可以做到這一點,很容易。我這樣做的方式是創建一個UIView子類(假設它叫做「MyView.m」和「MyView.h」),然後是一個叫做「MyView.xib」的nib。

首先,在筆尖中,單擊文件的所有者,然後將該類設置爲「MyView」。這將使得你的班級的IBOutlets/Actions顯示在IB中。添加一個頂級視圖(如果它還沒有)作爲主視圖,並添加其他自定義元素(UILabels和UIImageViews)作爲主UIView的子視圖。 (請記住,如果你從一個nib初始化,你將從 - (id)initWithCoder:(NSCoder *)aDecoder)獲得inited。

NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil]; 
UIView *mainView = [subviewArray objectAtIndex:0]; 

//Just in case the size is different (you may or may not want this) 
mainView.frame = self.bounds; 

[self addSubview:mainView]; 

這樣做是加載視圖層次從筆尖到NSArray的,因爲你只有一個頂級的UIView,你只需將其添加爲自定義的UIView的子視圖。

這使您可以在Interface Builder中設計UIViews(以及UIView的其他子類)。

編輯:更新爲OP的編輯。

我一直這樣做的方式是首先遵循上面的指示。一個不同之處在於,在ButtonTest筆尖中,您將UIView的類更改爲ButtonTest,但將文件所有者的類更改爲ButtonTest。然後,在ButtonTest.m裏面,做loadNibNamed的東西。現在,要將該對象添加到ButtonTestViewController.xib,請添加一個UIView(或UIButton,無論ButtonTest是從哪個子類繼承的),然後將該類更改爲ButtonTest。

這有點令人困惑,所以我會嘗試按文件分解它。

ButtonTestViewController.xib:添加一個UIButton(不管的ButtonTest從繼承),並改變類ButtonTest

ButtonTest.m:裏面的 「的initWithCoder」 的方法,做所有的 「loadNibNamed」 的東西,我有以上

ButtonTest.xib:將文件的所有者類更改爲ButtonTest並鏈接所有IBOutlet和IBA

+0

我覺得OP已經得到了這麼遠了。他問如何隨後在其他.xib文件中使用MyView.xib,並能夠完全編輯自定義界面。 –

+0

馬特是對的,我用一個新問題編輯了這個問題。請看一下。 – Idan

+0

我已經編輯了我的答案,以便更清楚一點。我認爲這是你想要做的。 – Ned

-1

如果您的類是UIButton的子類,例如,您可以在Interface Builder中打開該庫並在搜索時在類標籤下它和你可以拖放。

您也可以拖放一個UIButton並將其類設置在檢查器窗格中。

但是,因爲你有自己的.xib可能會搞砸了,在這種情況下只是忽略我。

5

在評論你們有些人問,如果這個解決方案不會產生無限循環,我沒有足夠的聲譽答案,所以這裏是我的答案:

環路存在,如果在你的XIB的根視圖將「自定義類」設置爲MyView。這會導致從XIB加載的視圖再次調用MyView 的初始化程序並因此創建無限循環的情況。解決方法是「Custom class」應該是UIView,並且只有File Owner的類應該設置爲MyView(以便能夠分配IBOutlets和IBActions)。

1

雨燕3.0

創建快捷文件,類

class ViewXIBfileClassView: UIView { 
..... 
} 

創建XIB文件,觀點:ViewXIBfileClassView

創建包裝視圖類

class ViewWrapper: UIView { 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     let view = UINib(nibName: "ViewXIBfileClassView_file", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! viewXIBfileClassView 
     self.addSubview(view) 
     view.bindEdgesToSuperview() 
    } 
} 

外接擴展的UIView

extension UIView { 
    /// Adds constraints to the superview so that this view has same size and position. 
    /// Note: This fails the build if the `superview` is `nil` – add it as a subview before calling this. 
    func bindEdgesToSuperview() { 
     guard let superview = superview else { 
      preconditionFailure("`superview` was nil – call `addSubview(view: UIView)` before calling `bindEdgesToSuperview()` to fix this.") 
     } 
     translatesAutoresizingMaskIntoConstraints = false 
     ["H:|-0-[subview]-0-|", "V:|-0-[subview]-0-|"].forEach { visualFormat in 
      superview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: visualFormat, options: .directionLeadingToTrailing, metrics: nil, views: ["subview": self])) 
     } 
    } 
} 

使用的UIViewViewWrapper所有XIB文件裏面你想