【问题标题】:How do I reload UIScrollView containing ViewControllers to add/remove view controllers如何重新加载包含 ViewControllers 的 UIScrollView 以添加/删除视图控制器
【发布时间】:2019-11-12 20:01:57
【问题描述】:

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

目前我正在尝试使用协议在关闭 CityListViewController 时在 scrollViewController 中调用 viewDidLoad 但出现错误:

致命错误:在展开 Optional 时意外发现 nil 值:文件)

当它到达时:

let weatherScreen = storyboard!.instantiateViewController(identifier: "View Controller") as! ViewController

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

class ScrollViewController: UIViewController, ScrollReloadProtocol {

    func reloadScrollView() {

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

    @IBOutlet weak 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 weatherScreen = storyboard!.instantiateViewController(identifier: "View Controller") as! ViewController

            weatherScreen.view.translatesAutoresizingMaskIntoConstraints = false

            totalScrollView.addSubview(weatherScreen.view)

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

        return weatherScreen
    }
}

【问题讨论】:

  • storyboard 是什么,在哪里加载?
  • 我不确定......我正在关注如何制作一个充满 ViewControllers 的滚动视图的教程,他们使用这个函数来做到这一点。还有其他方法可以避免此错误吗?

标签: swift scrollview protocols viewcontroller viewdidload


【解决方案1】:

你可以试试这样的:

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

最好使用一个词作为标识符:“ViewController”,并给它与类相同的名称。确保在您的实际情节提要中也设置这些值。

【讨论】:

  • 所以这行得通并且成功了,所以我越过了那条线,但我现在收到一个错误(致命错误:在隐式展开可选值时意外发现 nil:文件):totalScrollView.addSubview(weatherScreen .view) totalScreenView 是 nil 有没有办法让它加载?
  • 您是否将totalScrollView 连接到情节提要中的相应视图?这是非常基本的东西,请参见此处:developer.apple.com/library/archive/referencelibrary/…
  • 喜欢创建一个 IBOutlet?是的,我做到了
  • 如果一切设置正确,请尝试删除声明IBOutletweak。否则不知道为什么 totalScroillView 在那个时候会为零。尝试单步执行您的代码,看看会发生什么
  • 我试过去掉weak,没有变化。我感觉这与存在一个包含 WeatherViewControllers 的 ScrollViewController 并且您从 WeatherViewController 转到 CityListViewController 的事实有关。所以也许在关闭 CityListViewController 时,由于某种原因没有加载滚动视图? (即使 WeatherviewControllers 位于 scrollView 内部)如果我不调用此协议,它仍然存在但不会重新加载 scrollView,因此如果我在 CityListViewController 上添加城市,则不会显示。
猜你喜欢
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多