Работа с предварительно настроенными представлениями в Xcode/Swift

Предположим, я каким-то образом настроил представление в раскадровке в Xcode. Я также написал подкласс UIView — «CustomView» для использования с этим представлением. Этот CustomView имеет свойства, соответствующие элементам, из которых состоит UIView в раскадровке.

Во-первых, можно ли каким-то образом связать свойства подкласса CustomView с элементами пользовательского интерфейса представления в Storyboard (представление имеет метки, изображения и т. д.)?

Я знаю, что могу создавать IBOutlets. Но я думаю, что было бы не так эффективно подключать все элементы представления к одному VC, потому что у меня есть те же самые CustomViews, сложенные в UIStackView (всего в UIStackView есть три CustomView).

Если нет, то как наиболее эффективно настроить такие элементы программно (я хочу установить значения свойств через API, чтобы каждый CustomView выглядел одинаково, но его элементы имели разные значения). Я не хочу создавать представление, которое я настроил в раскадровке полностью с помощью кода, потому что добавление ограничений и размещение подпредставлений было бы огромной проблемой (хотя я знаю, что это возможно сделать).


person phbelov    schedule 01.03.2016    source источник


Ответы (1)


Хорошо, я думаю, вы спрашиваете, что у вас есть uiview со стеком внутри него, MyCustomUIView. Вы хотите повторно использовать это представление три раза на одном и том же контроллере представления MyViewController и каждый раз загружать в него разные данные. Это правильно?

Если это та настройка, которую вы хотите, вы устанавливаете для всех выходов значение MyCustomUIView. В MyViewController вы создаете три выхода для трех ваших представлений (view1, view2, view3) и программно загружаете MyCustomView в каждое представление (view1, view2, view3), а затем получаете доступ к меткам и другим выходам из этих представлений как view1.label, view2.label и т. д. Это было бы проще/чище, если бы вы использовали xibs вместо раскадровки, кстати. Лично я бы сделал это, но если ваш проект основан на раскадровке, вы можете оставить MyViewController на раскадровке и создать xib для MyCustomUIView, а затем загрузить его, как я описал выше.

Другой способ настроить это в раскадровке — использовать UITableView на MyViewController с 3 ячейками вместо трех ваших UIView. Как правило, это был бы предпочтительный способ для повторного использования представлений по многим причинам. Одной из причин может быть то, что если вы когда-нибудь захотите 4 представления или только 2, это очень просто изменить. Вам не нужно менять все UI/ограничения в MyViewController.

Чтобы ответить на ваше беспокойство по поводу программных ограничений... да, это боль. Однако Apple добавила якоря, которые можно использовать для упрощения программных ограничений макета: https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UILayoutGuide_Class_Reference/index.html#//apple_ref/doc/uid/TP40015257-CH1-DontLinkElementID_13

Или вы можете использовать какаопод PureLayout, который еще больше упрощает работу: https://github.com/PureLayout/PureLayout

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Если вы используете xib и добавляете его программно, вы должны сделать следующее:

Создайте файл класса Cocoatouch введите здесь описание изображения

На следующем экране сделайте его UIViewController и отметьте «Также создать файл XIB». введите здесь описание изображения

Затем в MyViewController:

view1 = NSBundle.mainBundle().loadNibNamed(String(MyCustomView), owner: nil, options: nil).first as! MyCustomView
view1.someLabel.text = "set the text"

view2 = NSBundle.mainBundle().loadNibNamed(String(MyCustomView), owner: nil, options: nil).first as! MyCustomView
view2.someLabel.text = "set the text"

view3 = NSBundle.mainBundle().loadNibNamed(String(MyCustomView), owner: nil, options: nil).first as! MyCustomView
view3.someLabel.text = "set the text"

Помимо использования представления таблицы или представления коллекции, как вы упомянули в своем комментарии, я на самом деле не знаю, как иметь повторно используемое представление (или, если это возможно) в раскадровке только без xibs. Возможно, если это возможно, кто-то еще ответит :)

Теперь, когда у вас есть эта основная информация, погуглите о xib, если вы все еще запутались. Найдите переполнение стека для «добавить xib swift», и вы найдете много результатов. И, конечно же, ответьте, если у вас есть еще вопросы!

person Abbey Jackson    schedule 01.03.2016
comment
Спасибо за ваш ответ. Вы меня правильно поняли. Что вы подразумеваете под программной загрузкой MyCustomView в каждое представление? Честно говоря, я никогда не использовал xibs. Может быть, мне нужно провести некоторое исследование по этой теме :) Я до сих пор не понимаю, есть ли способ связать свойства из MyCustomView с (многоразовым) представлением раскадровки. Или это можно сделать только с xibs? Да, я думал об использовании TableView, но я не знаю, можно ли его прокручивать по горизонтали :) Возможно, UICollectionView был бы лучше в моем случае. - person phbelov; 02.03.2016
comment
В раскадровках они все равно загружаются программно. Есть механизм, который делает все это за кулисами. Теперь использование (в SB пришло), так что вам нужно иметь дело с этим.. С точки зрения раскадровки, NavigatoinController — это своего рода точка поворота, куда вы смотрите. Но наследственность довольно проста... Позовите меня, если вам нужна помощь.. - person Adrian Sluyters; 02.03.2016
comment
Я отредактировал свой ответ, включив в него информацию о том, как добавить xib. - person Abbey Jackson; 03.03.2016