【问题标题】:ScrollView IBOutlet nil when using protocol to call function in viewDidDisappear使用协议调用 viewDidDisappear 中的函数时,ScrollView IBOutlet nil
【发布时间】:2019-11-13 03:04:08
【问题描述】:

我有一个滚动视图,其中包含动态数量的 WeatherViewController,每个都显示用户保存的不同城市的天气数据。用户可以从 WeatherViewControllers 转到 CityListViewController。他们可以在列表中添加和删除城市,然后在关闭 CityListViewController 时从滚动视图中添加和删除 WeatherViewControllers,这就是我遇到问题的地方。

目前我正在尝试使用协议来调用函数 reloadScrollView,该函数在关闭(viewDidDisappear)CityListViewController 时调用 scrollViewController 中的 viewDidLoad 但出现错误:

Fatal error: Unexpectedly found nil while unwrapping an Optional value: file

当它到达时:

totalScrollView.addSubview(weatherScreen.view)

使用调试器时,我发现 totalScrollView 为 nil,这就是问题所在。有没有办法让 scrollView 加载,所以在关闭另一个 viewController 时它不是 nil

使用这个协议调用这个函数是不是更好的调用时机?

旁注:在最初打开应用程序时,滚动视图会正确加载 UIScrollView 中所有正确的 WeatherViewController 以及列表中的正确城市。

class ScrollViewController: UIViewController, ScrollReloadProtocol {

func reloadScrollView() {

    print("SCROLL RELOADED!!!!!*******")
    self.viewDidLoad()
}

@IBOutlet var totalScrollView: UIScrollView!
var pages = [ViewController]()
var x = 0
var weatherScreensArray = [SavedCityEntity]()
var weatherScreenStringArray = [String]()
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
var horizString = "H:|[page1(==view)]"

let defaults = UserDefaults.standard


override func viewDidLoad() {
    super.viewDidLoad()

    //userDefaults used to keep track of which screen is which to put different cities on different viewControllers
    defaults.set(0, forKey: "screenNumber")
    //load cities to get number of cities saved
    loadCities()

    var views : [String: UIView] = ["view": view]
    //create all weatherWeatherControllers
    while x <= weatherScreensArray.count {

        pages.append(createAndAddWeatherScreen(number: x))
        weatherScreenStringArray.append("page\(x+1)")
        views["\(weatherScreenStringArray[x])"] = pages[x].view
        let addToHoriz = "[\(weatherScreenStringArray[x])(==view)]"
        horizString.append(addToHoriz)

        x+=1
    }

    horizString.append("|")

    let verticalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:|[page1(==view)]|", options: [], metrics: nil, views: views)
    let horizontalConstraints = NSLayoutConstraint.constraints(withVisualFormat: horizString, options: [.alignAllTop, .alignAllBottom], metrics: nil, views: views)

    NSLayoutConstraint.activate(verticalConstraints + horizontalConstraints)
}

//Function to create and add weatherViewController
func createAndAddWeatherScreen(number: Int) -> ViewController {

        defaults.set(number, forKey: "screenNumber")

      let story = UIStoryboard(name: "Main", bundle: nil)
        let weatherScreen = story.instantiateViewController(identifier: "View Controller") as! ViewController


        weatherScreen.view.translatesAutoresizingMaskIntoConstraints = false

        totalScrollView.addSubview(weatherScreen.view)

        addChild(weatherScreen)
        weatherScreen.didMove(toParent: self)

    return weatherScreen
}

}

【问题讨论】:

  • 男人!你的方法真的很糟糕。
  • 哈哈,我还在学习。你能为我解释一个更好的方法吗?
  • 当然!你能解释一下整个场景吗?你想做什么?
  • 好吧,我制作了一个天气应用程序(用于学习目的)。类似于 iphone 上的默认应用程序。我让 weatherViewController 和 cityListControllers 工作。现在我添加了在不同的weatherViewControllers之间来回滑动的功能,以查看您保存的不同城市的天气,为此我使用了scrollViewController。 (我认为在最后添加它会使它变得更加困难,而且我从未尝试过实现这样的东西)所以现在我希望滚动视图动态添加另一个weatherView,如果用户在cityListController 中添加一个
  • 所以现在我正在尝试通过在关闭 CityListController 时重新加载 scrollViewController 来做到这一点,但我遇到了运行协议时 IBOutlets 仍然为零的问题

标签: swift scrollview protocols iboutlet


【解决方案1】:

跳过你做的不对的事实,让我们一次集中讨论一个问题。您正在尝试在 viewDidLoad 中隐式访问 totalScrollView,如果插座已链接,则应在该点加载。如果是nil,你应该:

  1. 确保您拥有定义ScrollViewController 布局的.storyboard.xib 文件。
  2. 确保从该故事板/xib 加载此控制器。
  3. 确保 storyboard/xib 文件中的视图控制器已将其类设置为 ScrollViewController,类似于以下打印屏幕:
  4. 确保在故事板/xib 中将插座链接到代码文件中的此属性(可能是ScrollViewController.swift)。如果不:
    • 在单独的编辑器中打开故事板和源代码文件
    • 从属性声明左侧的点拖放到storyboard中的UIScrollView
    • 确保添加了指向Referencing Outlets 的链接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    相关资源
    最近更新 更多