Пользовательская метка UIView и анимация не отображаются в контроллере представления

#ios #swift #uiview #swift3

#iOS #swift #uiview #swift3

Вопрос:

На самом деле у меня есть пользовательский uiview, который работает, и я думаю, что все в uiview, которое не работает, настроено так же, как и тот, который работает. Вот код:

 protocol SessionDisplayViewDelegate: class
{
     func homeButtonTapped()
}

class SessionDisplayView: UIView 
{

@IBOutlet var view: UIView!


@IBOutlet weak var accountImage: UIButton!

@IBOutlet weak var mySKView: SKView!
@IBOutlet weak var sessionTitle: UILabel!

weak var delegate: SessionDisplayViewDelegate?
required init(coder aDecoder: NSCoder)
{
    super.init(coder: aDecoder)!
    commonInitialization()

}

override init(frame: CGRect)  {
    super.init(frame: frame)
    commonInitialization()
}

func commonInitialization()
{
    Bundle.main.loadNibNamed("SessionDisplayView", owner: self, options: nil)
    self.addSubview(self.view)


    //accountImage = UIImage(data: ShareData.sharedInstance.accounts[ShareData.sharedInstance.indexOfCurrentAccount].picture!, scale: 1.0)

}

func onView()
{
    let curScene = MyScene(size: mySKView.bounds.size)
    curScene.scaleMode = SKSceneScaleMode.aspectFill
    mySKView.presentScene(curScene)
    let myImage = UIImage(data: (ShareData.sharedInstance.accounts[ShareData.sharedInstance.indexOfCurrentAccount]?.picture!)! as Data, scale: 0.5)

    accountImage.setImage(myImage, for: UIControlState())
    sessionTitle.text = ShareData.sharedInstance.accounts[ShareData.sharedInstance.indexOfCurrentAccount]?.name
    var myTest = sessionTitle.text
    self.view.setNeedsDisplay()

 }

@IBAction func homeButtonTouched(_ sender: UIButton)
{
    delegate?.homeButtonTapped()
}
}
  

Я не знаю, нужно ли вызывать self.view.setNeedsDisplay() — я просто пытаюсь заставить его работать. Заголовок не меняется, даже если переменная для заголовка меняется — я проверил это, и это работает. Либо проблема с подключением между меткой и переменной, либо контроллер представления не получает сигнал обновления для изменения контроллера представления. Я не знаю, что именно, и я не знаю, как определить, что это такое. Любые идеи о том, как это исправить, будут высоко оценены. Вот код ViewController:

 class SessionDisplayViewController: UIViewController, SessionDisplayViewDelegate
{

@IBOutlet weak var mySessionView: SessionDisplayView!
func homeButtonTapped()
{
   self.performSegue(withIdentifier: "ReturnHome", sender: self)
}
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    mySessionView.onView()
    mySessionView.sessionTitle.text = "Test"

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
override var shouldAutorotate : Bool {
    if (UIDevice.current.orientation == UIDeviceOrientation.landscapeLeft) || (UIDevice.current.orientation == UIDeviceOrientation.landscapeRight) || (UIDevice.current.orientation == UIDeviceOrientation.unknown)
    {
        return true
    }
    else
    {
        return false
    }
}

override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
    return [UIInterfaceOrientationMask.portrait, UIInterfaceOrientationMask.portraitUpsideDown]
}
override var preferredStatusBarStyle : UIStatusBarStyle
{
    return UIStatusBarStyle.lightContent
}
}
  

Любые мысли или предложения о том, как обновить UIView, будут приветствоваться. Спасибо.

С уважением,
Шон

Ответ №1:

Как вы добавляете свой пользовательский вид в свой корневой вид? Из кода или из xib / storyboard? Если вы сделали это с помощью xib / storyboard, вы должны переопределить awakeFromNib метод в своем пользовательском классе представления и вызвать commonInitialization внутри него. метод init() вызывался только в том случае, если вы создаете свое представление с помощью кода.

Комментарии:

1. Я попробовал это, и это не помогло. Оказывается, каким-то образом контроллер представления был поврежден — я удалил его и воссоздал заново, и это сработало. Хотя я не знаю, почему.