2017-01-12 1 views
0

Я пытаюсь создать простой UIView с помощью вызова следующей функции:UIView не отображая

func loadCell() { 
    let cell : UIView! 
    cell = UIView(frame: CGRect(x:50, y:50, width:50, height:50)) 
    cell.backgroundColor = UIColor(red:1.00, green:0.00, blue:0.00, alpha:1.00) 
    self.view?.addSubview(cell) 
    print("Test") 
} 

Я не получаю никаких ошибок, однако UIView, кажется, не появляется. Текст «Тест» печатается на консоль, который говорит мне, что это не проблема с вызовом функции. Другое дело, что я использую тот же самый код в другой функции в другой части моей программы, чтобы создать другой UIView, и этот код работает отлично. Я не знаю, почему этот код не работает. Сначала я думал, что это может быть проблема zPosition, но после экспериментов с zPosition я не вижу разницы.

Я тогда подумал, что это может быть связано с тем, что уже существуют другие UIViews, отображаемые во время вызова функции, а новый, который функция «должна» создавать, не отображается, потому что программа «Все в порядке, у вас уже есть UIView здесь, сэр! Не нужно отображать другого!», как это ни странно.

Обновление: Я вызываю функцию loadCell внутри другой функции, называемой drawGrid(). drawGrid() - простой вложенный цикл, который создает сетку UIViews x вдоль и y high. Функция drawGrid() отлично работает при нерестах на уровне 1, но как только уровень 1 завершен, и я пытаюсь появиться на уровне 2, а это не порождает следующий набор UIViews. Он печатает все мои print("Test") s в консоли несколько раз, что говорит мне, что он добирается до этой точки в программе, но не хочет создавать следующую сетку UIViews.

Update 2:

var gridSizeX:Int = 10 
var gridSizeY:Int = 10 
var gridArray: [[UIView?]] = Array(repeating: Array(repeating: nil, count: gridSizeY), count: gridSizeX) 

func loadCell(xPos:Int, yPos:Int) { 
    let xStart = Int(size.width/2/2) - ((gridSizeX * gridScale)/2) 
    let yStart = Int(size.height/2/2) - ((gridSizeY * gridScale)/2) 

    let cell : UIView! 
    cell = UIView(frame: CGRect(x: xStart + (xPos * gridScale), y:yStart + (yPos * gridScale), width:gridScale, height:gridScale)) 

    cell.layer.borderWidth = 1 
    cell.layer.borderColor = UIColor(red:0.00, green:0.00, blue:0.00, alpha:0.02).cgColor 
    cell.backgroundColor = UIColor(red:1.00, green:1.00, blue:1.00, alpha:0) 

    self.view?.addSubview(cell) 

    gridArray[xPos][yPos] = cell 
} 

func drawGrid() { 
    for y in 0 ... gridSizeY { 
     for x in 0 ... gridSizeX { 
      loadCell(xPos:x, yPos:y) 
     } 
    } 
} 


func breakGrid() { 
    for y in 0 ... gridSizeY - 1 { 
     for x in 0 ... gridSizeX - 1 { 
      gridArray[x][y]?.removeFromSuperview() 
     } 
    } 
} 

Как вы можете видеть, функции я разместил здесь в начале немного иначе, как я удалил ненужные, ненужную код не запутаться. Я добавил все это здесь, и если есть что-то, о чем вы не знаете, просто спросите :) Я также добавил функцию «BreakGrid()» при удалении/удалении предыдущей сетки UIViews. и после удаления я снова запустил drawGrid() для следующего уровня.

+0

Что он показывает, когда вы печатаете (self.view) '? – Keiwan

+0

Я проверил его, и ваш код отлично работает для меня –

+0

Когда я делаю 'print (self.view)' он просто печатает 'nil'. Таким образом, может возникнуть проблема. Я понятия не имею, почему это было бы так, поскольку Xcoder123 просто заявил, что он работает, но не хочет в моем проекте. Довольно странно – Terminal

ответ

0

Когда я делаю печати (self.view) он просто печатает ноль

Это означает, что ваш self.view является nil так ничего не подвиды вашей клетки. Вы должны проверить, почему ваш вид равен nil. Вероятно, он не был добавлен к self к тому времени, когда вызывается loadCell().

Итак, сосредоточьтесь на том, почему вид nil.

+0

Я не слишком уверен, что бы/могло заставить его быть нулевым. Есть ли что-нибудь, что вы могли бы предложить, которые могли бы помочь мне определить, почему он будет печатать нуль? – Terminal

+0

@Terminal Было бы неплохо, если бы вы отредактировали сообщение и добавили код, показывающий, где вы вызываете 'loadCell()', и где вы инициализируете 'self'. Любой связанный с этим код был бы полезен :) Но, вообще говоря, вы можете просто поместить 'print (self.view)' как будто каждая функция и посмотреть, где она преобразуется в 'nil'. Лучшая практика - использовать точки останова, конечно. –

+0

Я сделал то, что вы предложили, и поместил 'print (self.view)' после каждой строки функции, и он печатает 'nil' каждый раз. Я попытался изменить имя переменной, если есть еще один экземпляр имени 'cell' где-то еще в программе, но проблема там есть. И я вызываю 'loadCell()' внутри другой функции, называемой 'drawGrid()', которая зацикливает x * y количество раз, чтобы создать сетку из UIViews x * y количество раз. – Terminal

0

Скорее всего, вы вызываете свой метод слишком рано, прежде чем ваше представление будет инициализировано (возможно, вызывается из viewDidLoad?). Это объясняет, почему печать (self.view) равна нулю

Попробуйте вызова метода для viewWillAppear

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    loadCell() 
} 
+0

Когда я пытаюсь это решение, я получаю две ошибки. 1: «Метод не переопределяет какой-либо метод из его суперкласса» и 2: «Значение типа SKScene не имеет имени пользователяWillAppear». – Terminal

+0

Откуда вы вызываете свой метод? в классе UIViewController? класс UIView? – Ocunidee

+0

ОК, очевидно, вы работаете с SKScene. Вы установили камеру своего SKScene? anchorPoint? размер? Узел камеры в сцене, определяющий, какая часть пространства координат сцены видна в представлении. – Ocunidee

0

Я проверил ваш код, это работа совершенна. Пусть ваш взгляд не будет обновлен должным образом. Можете ли вы попробовать это на главной теме.

DispatchQueue.main.async { 
     let cell : UIView! 
     cell = UIView(frame: CGRect(x:50, y:50, width:50, height:50)) 
     cell.backgroundColor = UIColor(red:1.00, green:0.00, blue:0.00, alpha:1.00) 
     self.view.addSubview(cell) 
     print("Test") 
    } 
+0

Пробовал это решение, но, похоже, не хочет отображать UIView – Terminal

0

Пожалуйста, попробуйте этот

func loadCell() { 
     let cell : UIView = UIView(frame: CGRect(x:50, y:50, width:50, height:50)) 
     cell.backgroundColor = UIColor(red:1.00, green:0.00, blue:0.00, alpha:1.00) 
     self.view?.addSubview(cell) 
     print("Test") 
     print(self.view) 
    } 

Это может быть работа для вас я дал размер в момент инициализации.

+0

Это не изменит ситуацию. –

+0

Он работает для меня –

+1

Итак? Многие другие пользователи определили, что приведенный выше код работает для них. Но ваш ответ ничего не меняет о его коде. Является ли он инициализацией в одной строке или на следующей строке, не решит его проблему. –

Смежные вопросы