У вас есть несколько вариантов ... какой вариант лучше всего зависит от ваших потребностей на самом деле.
Как упомянул Вудсток в своем ответе, вы можете использовать NotificationCentre
, я не буду это повторять.
Другой вариант - сохранить имя изображения в UserDefaults
, которое вы собираетесь использовать для фонового изображения.
каждый раз, когда вы меняете фон ... установите значение
UserDefaults.standard.set(imageName, forKey "backgroundImageName")
Затем в каждом контроллере вида просто загрузите значение в viewWillAppear
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated: animated)
if let backgroundImageName = UserDefaults.standard.string(forKey: "backgroundImageName") {
self.backgroundImageView.image = UIImage(named: backgroundImageName)
}
}
Оба эти варианты не очень легко для модульного тестирования, хотя. Вы можете использовать Mocks, чтобы проверить это.
Преимуществом этого метода является то, что он «запоминает» настройку между пользователем, перезапускающим приложение.
Пример того, как вы можете уменьшить повторение кода, используя подклассы:
class WallpaperedViewController: UIViewController {
lazy private var imageView: UIImageView = {
let imageView = UIImageView()
view.addSubview(imageView)
view.sendSubview(toBack: imageView)
return imageView
}()
private func setWallPaperImage() {
let imageName = UserDefaults.standard.string(forKey: "backgroundImageName")
let image = UIImage(named: imageName!)
imageView.image = image
//imageView.contentMode = .scaleAspectFill
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
imageView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
imageView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.setWallPaperImage()
}
}
Затем для каждого ViewController, у которого есть фоновые изображения, просто расширьте этот класс:
class SomeViewController: WallpaperedViewController {}
Daniel в основном корректен, Вам нужно отображение. Однако существует 3 обходных решения.
CFCs выберет текущий путь как относительное корневое отображение, поэтому если Ваши CFCs будут всеми в том же каталоге, можно просто сказать
<cfcomponent name="MyComponent" extends="Example">
Или если Ваши компоненты находятся в подкаталогах от текущего cfc, можно получить доступ к нему:
<cfcomponent name="MyComponent" extends="subdirectory.Example">
Во-вторых при работе ColdFusion 8 можно определить отображение в application.cfc использование структуры отображений как это:
<cfset this.mappings["/MyApp"] = expandPath(".") />
Существует две хороших ссылки для Application.cfc, во-первых, пример Камдена Луча Application.cfc, который просто высказывает хорошее мнение того, что идет, где, затем CF8 Живая страница параметров настройки приложения Документов, которая имеет раздел по отображениям наряду с некоторыми хорошими комментариями.
Наконец, можно использовать встроенное отображение веб-корня, поэтому если приложение будет в подкаталоге под названием "MyApp" от веб-корня, то корневое отображение будет "MyApp". Скажем, Вы правильно вставляете свои компоненты:
wwwroot\MyApp\com\MyApp\example.cfc
Отображение на этот cfc в этом случае будет:
MyApp.com.MyApp.Example
И с помощью примера, можно расшириться как это:
<cfcomponent name="MyComponent" extends="MyApp.com.MyApp.Example">
Что-либо еще, такой, как будто Ваши компоненты за пределами веб-корня, или если Вы не уверены, чем структура папок Вашего законченного приложения будет, и необходимо будет установить отображение в Администраторе CF.
Теперь это только тестируется в cf8, таким образом, другой механизм мог отличаться.
если Вы хотите использовать относительные пути для расширения приложений, Вы можете, но Ваш должны запустить их с "/".. Например, можно сделать это для расширения application.cfc от веб-корня в каталог ниже Вас webroot:
<cfcomponent output="false" extends="/.application">
<!--- whatever code you have --->
</cfcomponent>
теперь скажем, у меня есть следующие пути в моем приложении:
[webroot]/1/1a
[webroot]/2
скажем, то, что application.cfc в [webroot]/1/1a расширяет application.cfc в [webroot]. теперь я хочу поместить application.cfc в [webroot]/2 и расширить application.cfc в [webroot]/1/1a. все, что я должен был бы сделать в моем [webroot]/2/application.cfc, следующее:
<cfcomponent output="false" extends="/./1/1a/application">
<!--- whatever code you have --->
</cfcomponent>
надежда это имеет смысл.
Если CFC не находится в том же каталоге как сценарий выполнения вызова, CFC должен быть расположен и сослан от пути относительно "Отображения".
Я нашел, что иногда необходимо удостовериться, что "/" отображается на корне документа веб-сервера, и это становится основой для всех относительных путей. Или можно установить отображение для каталога CFC, которые содержат все общие CFCs.
Этот экран найден в Администраторе ColdFusion под "Настройками сервера"-> "Отображения".