【问题标题】:Update data in ViewController of UIPageViewController更新 UIPageViewController 的 ViewController 中的数据
【发布时间】:2019-11-24 01:37:17
【问题描述】:

我有 PageViewController,我正在加载 ViewController,一切正常。但是,当我在 PageViewController 的 ViewController 中更新数据时,SecondViewController lbl1.text = "New Lbl1" 会崩溃。

错误:致命错误:在隐式展开时意外发现 nil 一个可选值

我在 PageViewController 中的代码:

import UIKit

class NewViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

@IBOutlet weak var pagerController: UIPageControl!
@IBOutlet weak var pageControllerView: UIView!

// The pages it contains
var pages =  [UIViewController]()

// The UIPageViewController
var pageContainer: UIPageViewController!
// Track the current index
var currentIndex: Int?
private var pendingIndex: Int?

override func viewDidLoad() {
    super.viewDidLoad()

    // Setup the pages
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let page1 = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
    let page2: UIViewController! = storyboard.instantiateViewController(withIdentifier: "SecondViewController")
    let page3: UIViewController! = storyboard.instantiateViewController(withIdentifier: "ThirdViewController")
    pages.append(page1)
    pages.append(page2)
    pages.append(page3)

    page1.variable = "This is strig..."

    // Create the page container
    pageContainer = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
    pageContainer.delegate = self
    pageContainer.dataSource = self
    pageContainer.setViewControllers([page1], direction: UIPageViewController.NavigationDirection.forward, animated: false, completion: nil)

    // Add it to the view
    pageControllerView.addSubview(pageContainer.view)

    // set the frame of the pageContainer view to match its superview (the red view)
    pageContainer.view.frame = pageControllerView.bounds
    // let it resize if needed (such as device rotation)
    pageContainer.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]


    // Configure our custom pageControl
    view.bringSubviewToFront(pagerController)
    pagerController.numberOfPages = pages.count
    pagerController.currentPage = 0


}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


// MARK: - UIPageViewController delegates

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
    let currentIndex = pages.firstIndex(of:viewController)!
    if currentIndex == 0 {
        return nil
    }
    let previousIndex = abs((currentIndex - 1) % pages.count)
    return pages[previousIndex]
}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
    let currentIndex = pages.firstIndex(of:viewController)!
    if currentIndex == pages.count-1 {
        return nil
    }
    let nextIndex = abs((currentIndex + 1) % pages.count)
    return pages[nextIndex]
}


func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
    pendingIndex = pages.firstIndex(of:pendingViewControllers.first!)
}

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    if completed {
        currentIndex = pendingIndex
        if let index = currentIndex {
            pagerController.currentPage = index
        }
    }
}

@IBAction func barBtnAction(_ sender: UIBarButtonItem) {
    SecondViewController().setNewData()
}


}

我在 ViewController 中的代码:

import UIKit

class SecondViewController: UIViewController, UITableViewDelegate,  UITableViewDataSource {

@IBOutlet weak var tblView: UITableView!
@IBOutlet weak var tblHeight: NSLayoutConstraint!
@IBOutlet weak var lbl1: UILabel!
@IBOutlet weak var lbl2: UILabel!


override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    tblView.delegate = self
    tblView.dataSource = self

}

@IBAction func btn(_ sender: Any) {

    print("ViewController second")

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 5
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
    cell?.textLabel?.text = "\(indexPath.row)"

    return cell!
}

func setNewData() {
    lbl1.text = "New Lbl1"
    lbl2.text = "New Lbl2"
    tblHeight.constant = 250
}

}

我的PageVC

我的第二个VC

【问题讨论】:

    标签: ios swift cocoa-touch uiviewcontroller uipageviewcontroller


    【解决方案1】:

    这个

    SecondViewController().setNewData()
    

    在没有布局的情况下访问第二个 vc,因为您应该从情节提要中加载它,而无需连接插座/因此不会崩溃,您可能需要

    let sec = pages[1] as! SecondViewController
    sec.setNewData()
    

    这个SecondViewController() 用于在完全以编程方式创建 vc 时使用 1 从情节提要中执行此操作时,所有出口都将为零,因为除了您创建一个新实例之外,该初始化程序还没有加载布局1 在寻呼机控制器中

    【讨论】:

    • 你能解释一下,到底发生了什么
    • 我这样调用 page1.setNewData() 因为在 viewDidLoad() 中,我已经在加载完整的 VC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    相关资源
    最近更新 更多