2017-01-21 2 views
2

У меня возникли проблемы с пониманием идеи объектов. Из того, что я читал, они являются экземплярами класса. Когда они учатся быстро, их легко понять. Просто создать класс и создать экземпляр этого, и оттуда, вы можете изменить его свойства и вызвать его методы:Обдумывание объектов в iOS

class ExampleClass { 
    let ExampleProperty = "rabbit" 
} 

let exampleInstance = ExampleClass() 

Но я не понимаю, как это переводится при использовании IOS, так как у меня нет видели какие-либо объекты, которые еще явно созданы:

var example = Wss() 

Так что мои вопросы:

  1. есть такие вещи, как кнопки, метки и объекты ползунков?

-Если, где «код» позади них? Почему кнопки, метки и т. Д. Отображаются даже до того, как они подключены через выходы и действия к контроллеру просмотра? Есть ли скрытый «var thisButton = ThisViewController()», встроенный в каждый из этих слайдеров и кнопок?

  1. Если мои предположения ошибочны, может кто-нибудь объяснить мне, как работают объекты?
+0

Код объектов, таких как кнопки, метки, слайдеры и т. Д. Находится внутри [UIKit framework] (https://developer.apple.com/reference/uikit). – jtbandes

ответ

1

"Есть ли скрытый" var thisButton = ThisViewController() ", встроенный в каждый из этих ползунков и кнопок?"

Нет, и это именно то, где превосходит интерфейс. Большая часть современного интерфейса интерфейса Xcode поставляется с NeXTSTEP. Когда вы перетаскиваете новый компонент пользовательского интерфейса, например NSButton, и размещаете его на доске объявлений, Xcode создает новый объект класса NSButton для вас. Когда вы сохраняете свой файл, Xcode сериализует все объекты вашей истории в файл .nib. В то время, когда это было изобретено, оно было совершенно революционным, все это стало возможным благодаря динамизму Objective C. Это сделало программирование GUI намного более простым и динамичным. Каждый объект в вашей панели расскажет о своем классе. Например, когда вы создаете новый NSButton, вы можете открыть инспектора и убедиться, что его класс равен NSButton. Когда вы добавляете пользовательские представления в свое приложение, они отслеживают свой класс одинаково. Всякий раз, когда загружается файл nib, эти представления создаются из их классов. Возможно, вы заметили, что вы никогда не переопределяете инициализацию своих представлений. Вместо этого вы переопределяете методы, такие как awakeFromNib. Это связано с тем, что за сценой выполняется много работы за сценой, начиная с момента создания экземпляра объекта, до времени. За это время IBOutlets и IBActions привязаны к вам.

Конкуренты пытались создать похожие приложения для построения интерфейса, но в конечном итоге они прибегли к созданию кода за кулисами. В этих системах, когда вы сохранили файл интерфейса, программа будет генерировать исходный файл, содержащий код, который инструктирует, как создавать эти объекты заново всякий раз, когда загружается интерфейс. Тем не менее, это оказалось значительно более сложной задачей, а затем просто сериализацией объектов, поэтому эти системы были подвержены ошибкам и значительно сложнее отлаживать (поскольку вы пытаетесь отлаживать исходные файлы, сгенерированные компьютером).

0

Ответ на ваши вопросы:

  1. Да. Ваши объекты только создаются из NIB или Storyboard. Таким образом, NIB или Storyboard создадут для вас эти визуальные элементы (UI), к которым вы можете получить доступ через IBOutlets.
  2. Ваши предположения, не совсем ошибочные, как в случае, на самом деле есть что-то, выделяющее эти объекты для вас , NIB или Storyboard просто описывают способ создания этих объектов. Также некоторые другие настройки, такие как рамки, цвета и т. Д.

Подробнее о том, как эти связи можно найти here.

0

Опираясь на ответ Александра:

UIView объекты имеют метод init(frame:), что позволяет создать новый объект UIView с указанной рамкой.

Другие подклассы UIView могут иметь методы init, которые принимают дополнительные параметры.

Объекты UIView также поддерживают метод init init(coder:), который знает, как создать объект из потока хранимых данных. Это называется «десериализация» объекта или преобразование его из байтового потока обратно в запущенный объект.

Когда вы строите объект в файле раскадровки или XIB в Interface Builder, система сериализует объект в поток байтов и сохраняет его в вашей раскадровке/XIB.

Затем, когда вы вызываете сцену раскадровки/XIB, система считывает поток данных и использует его для воссоздания (десериализации) объектов, описанных в раскадровке/XIB.

Эффект по существу такой же, как если бы вы написали кучу кода, который создал и настроил все ваши представления, но вместо того, чтобы писать весь этот код, вы можете построить свой интерфейс в Interface Builder, что быстрее и проще создавать и МНОГО быстрее и проще обновлять и поддерживать, чем набор настраиваемого кода.

+0

в кратчайшие сроки легче создать, но при длительной длине кода код намного лучше поддерживать – muescha

+0

Вы говорите, что интерфейс, построенный вручную в коде, лучше поддерживать? Я категорически не согласен. –

+0

Вы когда-нибудь понимали, что изменилось, если вы прочитали sccrled nib/xib xml commit diff запроса на растяжение? – muescha

0

Но я не понимаю, как это переводится при использовании IOS, так как я не видел какие-либо объекты создаются еще явно

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

let defaults = NSUserDefaults.standardUserDefaults() 

Здесь defaults получает ссылку на пользователя по умолчанию возражают, что система обеспечивает. Вам не нужно создавать экземпляр NSUserDefaults самостоятельно.

Есть такие вещи, как buttons, метки и ползунки?

Да, это те случаи, UIButtonUILabel и UISlider соответственно.

Если да, то где «код» позади них?

Это UIKit framework. Вы не видите исходный код для этих классов, но вы все равно можете использовать их, привязав фреймворк к вашему приложению.

Почему кнопки, этикетки и т. Д. Отображаются даже перед их подключением через розетки и действия к контроллеру просмотра?

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

let storyboard = UIStoryboard(name: "MyStoryboard", bundle: nil) 
let controller = storyboard.instantiateViewController(withIdentifier: "MyViewController") 

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