Расширьте CFC использование относительного пути

У вас есть несколько вариантов ... какой вариант лучше всего зависит от ваших потребностей на самом деле.

Как упомянул Вудсток в своем ответе, вы можете использовать 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 {}
9
задан DEfusion 13 November 2008 в 15:11
поделиться

3 ответа

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.

10
ответ дан 4 December 2019 в 14:32
поделиться

Теперь это только тестируется в 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>

надежда это имеет смысл.

2
ответ дан 4 December 2019 в 14:32
поделиться

Если CFC не находится в том же каталоге как сценарий выполнения вызова, CFC должен быть расположен и сослан от пути относительно "Отображения".

Я нашел, что иногда необходимо удостовериться, что "/" отображается на корне документа веб-сервера, и это становится основой для всех относительных путей. Или можно установить отображение для каталога CFC, которые содержат все общие CFCs.

Этот экран найден в Администраторе ColdFusion под "Настройками сервера"-> "Отображения".

2
ответ дан 4 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: