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, вы либо получаете текстовый файл со ссылкой на полный путь к файловой системе, либо символическую ссылку, в зависимости от конфигурации. Данные, на которые ссылается символическая ссылка, не хранятся в репозитории.
Да, вы можете выполнить цикл и создать несколько элементов.
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. Это работает для вас?
Вы, безусловно, можете сделать это с помощью прокрутки и просмотра стека.
Ваша основная проблема заключалась в том, что вы создаете свою «деталь» вне цикла 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
}()
}
Примечание: если вы считаете, что вам может понадобиться партий деталей, вы, вероятно, лучше отключить использование табличного представления и спроектировать «деталь» как ячейку многократного использования.