2015-10-02 4 views
0

Я пытаюсь загрузить программный код без использования IBOutlets в раскадровке.Загрузить UIView из xib без раскадровки

Я установил пользовательский класс владельца файла и создал выходы для изображений и меток. Я создал экземпляр UINib и вызвал instantiateWithOwner в моем настраиваемом классе, чтобы вручную загрузить nib. Теперь я пытаюсь загрузить nib на uitableviewcontroller.

Мой вопрос заключается в том, как загрузить этот xib на контроллер вида без добавления uiview в контроллер просмотра с помощью раскадровки и без подключения выходов к uiview.

Существует несколько вопросов и руководств по загрузке наконечника с помощью раскадровки и IBOutlets, что прямолинейно.

Может ли кто-нибудь сказать мне, как это сделать программно, быстро?

Примечание: У меня есть два диспетчера представления в моем проекте. У VC1 есть коллекцияView с изображением и ярлыком. Я использую xib и пользовательский класс для отображения выбранного CollectionView в VC2.

ответ

0

Вам необязательно иметь настройку владельца. Вы можете просто создать экземпляр наконечника и ссылаться на созданные им объекты верхнего уровня. Сказав это, если вы передаете себя как владелец и подключитесь к розеткам, это тоже работает. Стоит отметить, что если вы создаете экземпляр nib несколько раз, значение выходов устанавливается на новые экземпляры каждый раз. Если вы хотите ссылаться на предыдущие, вам придется записывать их в другое свойство.

// 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 на контроллере представления без добавления uiview в контроллер представления в раскадровке и без подключения выходов к uiview.Я хочу сделать это программно. – mvien

+0

Мой пример кода сделает это. Строка прямо под комментарием «Использовать объекты верхнего уровня напрямую» приведет к ссылке на первый объект верхнего уровня в файле xib. Вы можете передать 'nil' в качестве владельца. –

1

Вы можете принять вид сверху вид XIB и положить его везде

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

Я пытаюсь загрузить XIB со значениями, переданными из коллекции. Таким образом, изображение и метки являются переменными. – mvien

+0

У меня уже есть этот метод в моем классе. Я пытаюсь загрузить XIB со значениями, переданными из коллекцииView в контроллере view1 для просмотра контроллера2. Таким образом, изображение и метки являются переменными. Как загрузить uiview в viewcontroller2 без использования IBOutlets в раскадровке. – 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 со значениями, переданными из коллекцииView в контроллере view1 для просмотра контроллера2. Таким образом, изображение и метки являются переменными. Как загрузить uiview в viewcontroller2 без использования IBOutlets в раскадровке. – 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 и адаптированный для меня (Swift 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.

В любом случае, этот код, безусловно, будет улучшен. Я грубый программист.

Смежные вопросы