Добавление видов с подпредставлениями программно, в цикле

TL; DR: данные, на которые ссылается символическая ссылка, не хранятся в репозитории.


Вы можете узнать, что делает Git с файлом, видя, что он делает, когда вы добавляете его в индекс. Индекс подобен предварительной фиксации. С зафиксированным индексом вы можете использовать git checkout, чтобы вернуть все, что было в индексе, в рабочий каталог. Итак, что делает Git, когда вы добавляете символическую ссылку на индекс?

Чтобы узнать, во-первых, сделать символическую ссылку:

$ ln -s /Path/referenced/by/symlink symlink

Git не знает о этот файл еще. git ls-files позволяет вам проверять ваш индекс (-s печатает stat -подобный вывод):

$ git ls-files -s ./symlink
$

Теперь добавьте содержимое символической ссылки в хранилище объектов Git, добавив его в индекс. Когда вы добавляете файл в индекс, Git сохраняет его содержимое в хранилище объектов Git.

$ git add ./symlink

Итак, что было добавлено?

$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0       symlink
$

Хэш является ссылкой к упакованному объекту, который был создан в хранилище объектов Git. Вы можете изучить этот объект, если вы посмотрите в .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c.

120000 - это режим файла. Это будет что-то вроде 100644 для обычного файла и является особым режимом для ссылок. Из man git-config :

core.symlinks

Если false, символические ссылки проверяются как маленькие простые файлы, содержащие текст ссылки. git-update-index (1) и git-add (1) не изменят записанный тип на обычный файл.

blockquote>

Используйте git cat-file -p для красивой печати содержимого:

$ git cat-file -p 1596f9db1
/Path/referenced/by/symlink

Итак, это то, что Git делает для символической ссылки: когда вы git checkout символически link, вы либо получаете текстовый файл со ссылкой на полный путь к файловой системе, либо символическую ссылку, в зависимости от конфигурации. Данные, на которые ссылается символическая ссылка, не хранятся в репозитории.

-1
задан Julian Silvestri 15 January 2019 в 19:01
поделиться

2 ответа

Да, вы можете выполнить цикл и создать несколько элементов.

let yArray = [0, 35, 75, 115, 155, 195]
let textArray ["NO.", "Code", "Br", "Stat", "Line", "B"]

var numOfViewsNeeded = 5

func createPart() -> UIView {
    let part = UIView()
    part.translatesAutoresizingMaskIntoConstraints  = false
    part.layer.cornerRadius = 4
    part.layer.masksToBounds = true
    part.backgroundColor = .random()
    part.heightAnchor.constraint(equalToConstant: 300).isActive = true

    for index in 0...numOfViewNeeded-1 {
        let partLabel = UILabel(frame: CGRect(x:10, y: yArray[index], width: 300, height: 50))
        partLabel.text = "\(textArray[index])"
        partLabel.textColor = .white
        part.addSubview(partLabel)
    }

    part.layer.zPosition = -1
    return part
}

Это без использования tableView или stackView. Это работает для вас?

0
ответ дан Niall Kehoe 15 January 2019 в 19:01
поделиться

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

Ваша основная проблема заключалась в том, что вы создаете свою «деталь» вне цикла for:

    // this creates ONE part view
    let part = createPart()
    // your loop simply adds and re-adds that one part view
    for i in 0..<numOfViewsNeeded {
        view.addSubview(part)
        stackView.addArrangedSubview(part)
    }

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

    for i in 0..<numOfViewsNeeded {
        // create a new part view
        let part = createPart()
        // add that new view to the stack view
        stackView.addArrangedSubview(part)
    }
[118 ] Вот модифицированная версия вашего кода, которая даст вам желаемый результат:

class AddStuffViewController: UIViewController {

    var numOfViewsNeeded = 5

    var bkgColors: [UIColor] = [
        .blue,
        .green,
        .red,
        .orange,
        .yellow
    ]

    func createPart(_ n: Int) -> UIView {
        let part = UIView()
        part.translatesAutoresizingMaskIntoConstraints  = false
        part.layer.cornerRadius = 4
        part.layer.masksToBounds = true
        part.backgroundColor = bkgColors[n] // .random()
        part.heightAnchor.constraint(equalToConstant: 300).isActive = true

        let partLabel1 = UILabel(frame: CGRect(x:10, y: 0, width: 300, height: 50))
        let partLabel2 = UILabel(frame: CGRect(x:10, y: 35, width: 300, height: 50))
        let partLabel3 = UILabel(frame: CGRect(x:10, y: 75, width: 300, height: 50))
        let partLabel4 = UILabel(frame: CGRect(x:10, y: 115, width: 300, height: 50))
        let partLabel5 = UILabel(frame: CGRect(x:10, y: 155, width: 300, height: 50))
        let partLabel6 = UILabel(frame: CGRect(x:10, y: 195, width: 300, height: 50))
        partLabel1.text = "NO."
        partLabel1.textColor = .white
        partLabel2.text = "Code"
        partLabel2.textColor = .white
        partLabel3.text = "Br"
        partLabel3.textColor = .white
        partLabel4.text = "Stat"
        partLabel4.textColor = .white
        partLabel5.text = "Line"
        partLabel5.textColor = .white
        partLabel6.text = "B"
        partLabel6.textColor = .white

        part.addSubview(partLabel1)
        part.addSubview(partLabel2)
        part.addSubview(partLabel3)
        part.addSubview(partLabel4)
        part.addSubview(partLabel5)
        part.addSubview(partLabel6)

        return part
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(containerScrollView)
        containerScrollView.addSubview(contentView)
        contentView.addSubview(stackMainView)

        for i in 0..<numOfViewsNeeded {
            let part = createPart(i)
            stackMainView.addArrangedSubview(part)
        }

        contentView.topAnchor.constraint(equalTo: self.containerScrollView.topAnchor, constant: 0).isActive = true
        contentView.leadingAnchor.constraint(equalTo: self.containerScrollView.leadingAnchor, constant: 0).isActive = true
        contentView.trailingAnchor.constraint(equalTo:self.containerScrollView.trailingAnchor, constant: 0).isActive = true
        contentView.bottomAnchor.constraint(equalTo: self.containerScrollView.bottomAnchor, constant: 0).isActive = true

        contentView.widthAnchor.constraint(equalTo:self.containerScrollView.widthAnchor, constant: 0).isActive = true

        containerScrollView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
        containerScrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 0).isActive = true
        containerScrollView.trailingAnchor.constraint(equalTo:self.view.trailingAnchor, constant: 0).isActive = true
        containerScrollView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor, constant: 0).isActive = true

        stackMainView.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 50).isActive = true
        stackMainView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: 8).isActive = true
        stackMainView.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -8).isActive = true
        stackMainView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: -30).isActive = true


    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print(stackMainView.arrangedSubviews.count)
    }

    var containerScrollView: UIScrollView = {
        let scrollView = UIScrollView()
        scrollView.translatesAutoresizingMaskIntoConstraints  = false
        scrollView.backgroundColor = .gray
        scrollView.isScrollEnabled = true
        return scrollView
    }()

    var contentView: UIView = {
        let view = UIView()
        view.translatesAutoresizingMaskIntoConstraints  = false
        view.backgroundColor = .cyan
        return view
    }()
    let stackMainView: UIStackView = {
        let stackView = UIStackView()
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.axis = .vertical
        return stackView

    }()
}

Примечание: если вы считаете, что вам может понадобиться партий деталей, вы, вероятно, лучше отключить использование табличного представления и спроектировать «деталь» как ячейку многократного использования.

0
ответ дан DonMag 15 January 2019 в 19:01
поделиться
Другие вопросы по тегам:

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