为什么我不能在UIPageViewController中设置视图控制器?

时间:2017-06-15 18:40:39

标签: ios arrays swift uiviewcontroller uipageviewcontroller

我正在尝试使用我从API中提取的5个事件来填充页面视图控制器。我们的想法是,用户可以浏览前5个最新事件,然后单击它们以查看有关该事件的更多详细信息。我遇到的问题是,一旦我得到事件,我想重新加载页面视图控制器的视图控制器,但是当我尝试设置视图控制器时,我收到一个错误:fatal error: unexpectedly found nil while unwrapping an Optional value。我为我的事件数组设置了一个属性观察器,这样一旦它被设置,我就会重新加载视图控制器。这就是我班级的样子:

class EventPageViewController: UIPageViewController {

var eventViewControllers = [EventViewController]()

var events: [Event] = []{
    didSet {
        self.reloadViewControllers()
    }
}


func reloadViewControllers(){

    self.dataSource = nil
    self.dataSource = self
    // Get top 5 events
    let topFiveEvents = Array(events.prefix(5))
    print(self.events.count)
    self.eventViewControllers.removeAll()
    print(eventViewControllers.count)

    // Set up view controllers
    for event in topFiveEvents{
        if let controller = self.storyboard?.instantiateViewController(withIdentifier: "event") as? EventViewController{
            print(event.title)
            // Just this line alone is what crashes the app
            controller.eventTitle.text = event.title
            self.eventViewControllers.append(controller)
        }
    }

    if self.eventViewControllers.count != 0 {
        let first = [self.eventViewControllers[0]]
        self.setViewControllers(first, direction: .forward, animated: false, completion: nil)

    }


}

override func viewDidLoad() {
    super.viewDidLoad()
    let timeMin = GTLRDateTime(date: Date()).rfc3339String
    let params = ["maxResults": "250",
                  "singleEvents": "true",
                  "timeMin": timeMin]
    NetworkManager.events(forPark: .all, withParameters: params, query: nil) { (events, error) in
        if error == nil {
            DispatchQueue.main.async {
                self.events = events
            }
        }
    }
}

override func viewDidLayoutSubviews() {
    for subView in self.view.subviews {
        if subView is UIScrollView {
            subView.frame = self.view.bounds
        } else if subView is UIPageControl {
            let pageControl = subView as! UIPageControl
            pageControl.currentPageIndicatorTintColor = UIColor(red:0.00, green:0.15, blue:0.29, alpha:1.0)
            pageControl.pageIndicatorTintColor = UIColor(red:0.00, green:0.15, blue:0.29, alpha:0.30)
            self.view.bringSubview(toFront: subView)


        }
    }
    super.viewDidLayoutSubviews()
}



}

如果我没有在视图控制器中设置任何内容,那么我将获得页面视图控制器以显示具有静态信息的视图控制器。我不确定我做错了什么。

1 个答案:

答案 0 :(得分:0)

在我看来,您的页面视图控制器正试图直接操纵它的子视图控制器的视图。不要那样做。

这一行:

controller.eventTitle.text = event.title

可能是原因,假设eventTitle是一个出口。

而不是这样做,将字符串属性添加到子视图控制器:

public var eventTitleString: String

然后设置:

controller.eventTitleString = event.title

在子视图控制器中,添加代码以将该值复制到您的字段中:

func viewWillAppear(_: animated: Bool) {
  super.viewWillAppear(animated)
  eventTitle.text = eventTitleString
}

@MrSaturn建议调用controller.loadViewIfNeeded(),这可能会修复你的崩溃,但这是不好的做法。您应该将视图控制器的视图视为私有,并且永远不要尝试从外部操纵它们。而是添加一个直接更新视图控制器视图的公共属性或函数。