2015-10-02 112 views
0

我正在嘗試以編程方式加載一個筆尖而不在故事板中使用IBOutlets。從xib加載UIView無故事板

我已經設置了文件所有者的自定義類,併爲圖像和標籤創建了插座。我創建了一個UINib實例,並在我的自定義類中調用了instantiateWithOwner來手動加載該筆尖。現在我試圖在uitableviewcontroller上加載nib。

我的問題是如何在視圖控制器上加載該xib,而無需使用故事板將視圖添加到視圖控制器,並且無需將插座連接到uview。

有幾個關於如何使用storyboard和IBOutlets加載筆尖的問題和教程,這很直接。

任何人都可以告訴我如何以編程方式,在迅速?

注意:我的項目中有兩個viewcontrollers。 VC1有一個帶有圖像和標籤的collectionView。我使用xib和自定義類來在VC2中顯示選定的collectionView。

回答

0

您不一定必須擁有所有者設置。您可以簡單地實例化該筆尖並引用由其創建的頂級對象。話雖如此,如果您確實通過自己作爲所有者並且連接了網點,那也可以。值得注意的是,如果您多次實例化了筆尖,則每次都將插口的值設置爲新實例。如果你想引用先前的那些,你將不得不在其他一些財產中捕獲它們。

// Create a UINib object for a nib named MyNib in the main bundle 
    let nib = UINib(nibName: "MyNib", bundle: nil) 

    // Instante the objects in the UINib 
    let topLevelObjects = nib.instantiateWithOwner(self /*or nil*/, options: nil) 

    // Use the top level objects directly... 
    let firstTopLevelObject = topLevelObjects[0] 

    // Or use any IBOutlets 
    doSomeStuff(self.someOutletProperty) 
+0

我確實將自己作爲所有者並在xib中將自己的插座連接到自定義類。我的問題是如何在視圖控制器上加載該xib,而無需在故事板中將視圖添加到視圖控制器,也無需將插座連接到uview。我想以編程方式進行。 – mvien

+0

我的示例代碼將執行此操作。註釋「直接使用頂級對象」下方的行將導致對xib文件中第一個頂級對象的引用。您可以通過'nil'作爲所有者。 –

1

您可以採取的頂視圖形式廈門國際銀行,並把它無處不

override func viewDidLoad() { 
    super.viewDidLoad() 
    let calendar = UINib(nibName: "<<NibFileName>>", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView 
    view.addSubview(calendar) 
} 
+0

我想加載XIB與從collectionView傳遞的值。所以,圖片和標籤是可變的。 – mvien

+0

我已經在我的自定義類中獲得了該方法。我試圖加載XIB與從viewView中傳遞的值在視圖controller1中查看controller2。所以,圖片和標籤是可變的。如何在storyboard中不使用IBOutlets的情況下在viewcontroller2中加載uiview。 – mvien

1

您可以使用此方法:

方法:

public static func getViewFromNib(nibName:String)-> UINib{ 
    let uiNib = UINib(nibName: nibName, bundle: nil) 
    return uiNib 
} 

使用方法:

let customView = getViewFromNib.instantiateWithOwner(ownerOrNil, options: nil) as! UIView 
    view.addSubview(customView) 
+0

我已經在我的自定義類中獲得了該方法。我試圖加載XIB與從viewView中傳遞的值在視圖controller1中查看controller2。所以,圖片和標籤是可變的。如何在storyboard中不使用IBOutlets的情況下在viewcontroller2中加載uiview。 – mvien

0

感謝您回答這個問題。他們都很好。我已經接受了最容易實施的那個。這是一種不同的方法,也將某些情況下工作:

var myView: myCoolView = myCoolView() // subclass of uiview with xib 

然後,添加在viewDidLoad中:

myView.frame = CGRectMake(0, 64, self.view.frame.size.width, 175) 
    myView.titleLabel.text = stringOne 
    myView.backgroundImage.image = imageOne 
    myView.contentMode = UIViewContentMode.ScaleAspectFill 
    myView.autoresizingMask = UIViewAutoresizing.FlexibleBottomMargin | UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleRightMargin | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleTopMargin | UIViewAutoresizing.FlexibleWidth 
    self.view.addSubview(myView) 
1

我發現從here另一種解決方案,並適用於我(斯威夫特2):

let myView = NSBundle.mainBundle().loadNibNamed("myView", owner: self, options: nil).first as! myView 
self.view.addSubview(myView) 
myView.translatesAutoresizingMaskIntoConstraints = false 
self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[view]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":myView])) 
self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[view]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":myView])) 
myView.myButton.setTitle("myTitle", forState: .Normal) 

以編程方式創建的約束。在xib中創建的插座很容易在主viewController類中使用。

無論如何,這個代碼肯定會有所改進。我是一個粗糙的程序員。