gpt4 book ai didi

ios - 为什么我不能在 UIPageViewController 中设置 View Controller ?

转载 作者:行者123 更新时间:2023-11-28 08:07:53 24 4
gpt4 key购买 nike

我正在尝试使用从 API 中提取的 5 个事件来填充页面 View Controller 。这个想法是用户可以翻阅前 5 个最新事件并单击它们以查看有关该事件的更多详细信息。我遇到的问题是,一旦我得到事件,我想为页面 View Controller 重新加载 View Controller ,但是当我尝试设置 View Controller 时,我得到一个错误:fatal error: unexpectedly found nil while unwrapping可选值。我为我的事件数组设置了一个属性观察器,以便在设置后重新加载 View Controller 。这是我的类(class)的样子:

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()
}



}

如果我没有在 View Controller 中设置任何内容,那么我将让页面 View Controller 显示带有静态信息的 View Controller 。我不确定我做错了什么。

最佳答案

在我看来,您的页面 View Controller 正试图直接操纵其 subview Controller 的 View 。不要那样做。

这一行:

controller.eventTitle.text = event.title

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

不要这样做,而是向您的 subview Controller 添加一个字符串属性:

public var eventTitleString: String

然后设置它:

controller.eventTitleString = event.title

然后在您的 subview Controller 中,添加代码以将该值复制到您的字段中:

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

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

关于ios - 为什么我不能在 UIPageViewController 中设置 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44574687/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com