iOS Swift - 来自其他 class 的函数没有 运行

iOS Swift - Function from other class doesn't run

我想创建一个 class 的模糊视图,如果出现任何问题,它应该出现在现有视图上。这是代码:

import Foundation
import UIKit

class checkProblems{

    let effectView:UIVisualEffectView = UIVisualEffectView (effect: UIBlurEffect(style: UIBlurEffectStyle.Light))
    var view: UIView
    let label = UILabel()
    let retry = UIButton()

    init(view: UIView){
        self.view = view
        self.check()
    }

    func check(){
        effectView.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)
        label.frame = CGRectMake(0, (self.view.frame.height/2)-20, self.view.frame.width, 40)
        label.text = "Server connection problems."
        label.textAlignment = NSTextAlignment.Center
        label.textColor = UIColor.darkGrayColor()
        label.font = UIFont (name: "HelveticaNeue-Light", size: 20)

        retry.frame = CGRectMake(0, (self.view.frame.height/2)+10, self.view.frame.width, 40)
        retry.setTitle("Tap here to retry.", forState: UIControlState.Normal)
        retry.addTarget(self, action: "pressed:", forControlEvents: .TouchUpInside)

        self.view.addSubview(effectView)
        effectView.addSubview(label)
        effectView.addSubview(retry)
    }

    func pressed(sender: UIButton!){
       println("here")
    }
}

这就是我在视图控制器上的调用方式:

let checkObject = checkProblems(view: view)

一切正常,直到我按下按钮 "Tap here to retry"。 然后,我的应用程序崩溃了。

我认为您的方法打破了 MVC-模式。其次是addAction方法对应引用的问题。 请将所有视图创建或交替代码添加到 viewController。这将使您的应用程序更容易理解。 我更改了您的代码以正确实现 MVC-Pattern(并使其完全可运行)

import UIKit

class ViewController: UIViewController {

  let effectView:UIVisualEffectView = UIVisualEffectView (effect: UIBlurEffect(style: UIBlurEffectStyle.Light))
  let label = UILabel()
  let retry = UIButton()

  override func viewDidLoad() {
    super.viewDidLoad()        
    check()
  }

  func check(){
    effectView.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)
    label.frame = CGRectMake(0, (self.view.frame.height/2)-20, self.view.frame.width, 40)
    label.text = "Server connection problems."
    label.textAlignment = NSTextAlignment.Center
    label.textColor = UIColor.darkGrayColor()
    label.font = UIFont (name: "HelveticaNeue-Light", size: 20)

    retry.frame = CGRectMake(0, (self.view.frame.height/2)+10, self.view.frame.width, 40)
    retry.backgroundColor = .blueColor()
    retry.setTitle("Tap here to retry.", forState: UIControlState.Normal)
    retry.addTarget(self, action: "pressed:", forControlEvents: UIControlEvents.TouchUpInside)

    effectView.addSubview(label)
    effectView.addSubview(retry)
    view.addSubview(effectView)    
  }
  func pressed(sender: UIButton){
    println("here")
  }
}

除了您的评论之外,我还向您展示了一个 MVC-conserving 方法的示例,该方法将子class UIViewController。然后你可以用 presentViewController:

加载你的 checkProblems class

来自调用的代码 VC:

import UIKit    
  class ViewController: UIViewController {
    override func viewDidLoad() {
      super.viewDidLoad()
        }
    override func viewDidAppear(animated: Bool) {
      super.viewDidAppear(animated)
      let checkProblemsVC = CheckProblemsViewController()
      presentViewController(checkProblemsVC, animated: true, completion: nil)
    }
  }

和新的子classed CheckProblemsViewController:

    import UIKit

class CheckProblemsViewController: UIViewController {

  let effectView:UIVisualEffectView = UIVisualEffectView (effect: UIBlurEffect(style: UIBlurEffectStyle.Light))
  let label = UILabel()
  let retry = UIButton()

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    check()
  }

  func check(){
    effectView.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)
    label.frame = CGRectMake(0, (self.view.frame.height/2)-20, self.view.frame.width, 40)
    label.text = "Server connection problems."
    label.textAlignment = NSTextAlignment.Center
    label.textColor = UIColor.darkGrayColor()
    label.font = UIFont (name: "HelveticaNeue-Light", size: 20)

    retry.frame = CGRectMake(0, (self.view.frame.height/2)+10, self.view.frame.width, 40)
    retry.backgroundColor = .blueColor()
    retry.setTitle("Tap here to retry.", forState: UIControlState.Normal)
    retry.addTarget(self, action: "pressed:", forControlEvents: UIControlEvents.TouchUpInside)

    effectView.addSubview(label)
    effectView.addSubview(retry)
    view.addSubview(effectView)

  }

  func pressed(sender: UIButton){
    println("here")
  }


}