2017-01-14 10 views
1

У меня есть небольшой XIB, Teste.xibloadNibNamed возвращает вид, а не «вид»?

enter image description here

принадлежит TesteView

class TesteView: UIView { 
    @IBOutlet var tf:UITextField! 
    @IBOutlet var sw:UISwitch! 
    } 

Теперь мы собираемся загрузить его (и, например, вещи его в представлении стека).

let t:TesteView = TesteView() 
let v = Bundle.main.loadNibNamed("Teste", owner: t, options: nil)?[0] as! UIView 
v.heightAnchor.constraint(equalToConstant: 200).isActive = true 
stack?.insertArrangedSubview(v, at: 3) 

Фактически, это нормально.

Все работает.

Но обратите внимание, что вы вставляете «v», а не «t». «v» - это не «TesteView», а просто проклятое представление, которое плавает вокруг.

Если вы делаете следующее,

t.heightAnchor.constraint(equalToConstant: 200).isActive = true 
stack?.insertArrangedSubview(t, at: 3) 

бессмысленно, это не работает.

Но t "является" представлением, это UIView (действительно, это TesteView). Это должно быть то, что вы вставляете.

Таким образом, вы должны использовать «две разные» вещи ...

t.tf.text = "WTF???" 
// use "t" for that sort of thing 
v.heightAnchor.constraint(equalToConstant: 200).isActive = true 
v.backgroundColor = UIColor.blue 
// but use "v" for that sort of thing 
stack?.insertArrangedSubview(v, at: 3) 

Это кажется странным, что «т» и «v» не то же самое.

(В самом деле, должен TesteView даже был подкласс UIView Может быть, это должно быть что-то другое - просто обычный класс ?? Кажется, один не может реально использовать его как вид так WTF является его ??)

Какая сделка на этом и/или что такое обычная идиома?


ПРИМЕЧАНИЕ ...

в настоящее время, нет никаких причин, чтобы когда-либо сделать это. Просто используйте небольшой UIViewController. На протяжении десятилетий все говорили: «Почему яблоко не позволяет вам просто загрузить контроллер просмотра по id?», Теперь вы можете это сделать. Нет проблем:

let t = self.storyboard?.instantiateViewController(withIdentifier: "TesteID") as! Teste 
    t.view.heightAnchor.constraint(equalToConstant: 200).isActive = true 
    stack?.insertArrangedSubview(t.view, at: 3) 
    t.tex.text = "WTH???" 
+0

Возможно, вы не хотите использовать пользовательский класс для владельца _File, но для самого представления. – holex

+0

http://stackoverflow.com/a/41637916/2019221 – Callam

+0

вы можете подключить выходы к _View_ не к _File's Owner_, но процедура не зависит от этого. – holex

ответ

1

Этот код не имеет смысла; ваше использование t бессмысленно:

let t:TesteView = TesteView() 
let v = Bundle.main.loadNibNamed("Teste", owner: t, options: nil)?[0] as! UIView 

Объект выдвижения owner является предоставление некоторого уже существующего экземпляра с свойствами, которые соответствуют точек в бобах. Это позволяет использовать розетки, и на виды, к которым они ведут, можно сразу же называть имя.

Это то, что происходит, когда пара контроллера/просмотра открывается из раскадровки, и поэтому раскадровки работают так, как они делают. Представление nib загружается контроллером вида как owner. Так что, если у вилки с изображением есть выход mySwitch, а контроллер вида имеет свойство розетки mySwitch, они совпадают, а термин self.mySwitch может использоваться экземпляром контроллера вида для обращения к коммутатору.

Вы можете установить одно и то же самое при загрузке файла .xib. Но вы этого не делаете; ваш код просто намеренно глупый.

Например (это из моей книги, и вы можете download and run пример для себя):

class ViewController: UIViewController { 
    @IBOutlet var coolview : UIView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     Bundle.main.loadNibNamed("View", owner: self) 
     self.view.addSubview(self.coolview) 
    } 
} 

Если вы настроили View.xib с классом своего файла Владелец прокси установлен в значение ViewController , и если вы нарисовали выход из File's Owner на вид и назвали это розеткой coolview, то при загрузке оно сопоставляется с свойством coolview, и последняя строка работает - мы можем ссылаться на загруженный nib вид как self.coolview.

Обратите внимание, что нам никогда не приходилось захватывать результат загрузки ниба в виде массива представлений, а затем ссылаться на нулевой элемент этого массива, как и вы. Вид получает прорезь прямо в имя coolview. То, что - это то, как вы загружаете наконечник, чтобы получить полезное имя или имена.

+0

Извините. Моей целью является то, что вы не захотите _make_ UIView _in code_ просто добавить в качестве «швабры» для доступа к выходам, а затем выбросить этот UIView, как и вы. Вы «уложили колоду», преднамеренно делая глупый пример. В _my_ примере владелец уже существует. – matt

+0

И я полностью не согласен с «в наши дни». Я использую _xib_ файлы все время. Раскадровки - еще один инструмент в наборе инструментов, но они не вытеснили ни один из моих других инструментов. – matt

+0

Хорошо, я постараюсь понять .......... – Fattie

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

  • Нет связанных вопросов^_^