【问题标题】:Generating a separate page for each array item in Swift Xcode在 Swift Xcode 中为每个数组项生成一个单独的页面
【发布时间】:2020-10-11 18:31:57
【问题描述】:

当我使用第一段代码时,我得到了两个单独的页面,第 1 页的“运行 1”和第 2 页的“运行 2”。

let pages: [String] = ["Run1","Run2"]
            
            for text in pages {
                let vc = TextViewController(with: text)
                myControllers.append(vc)
            }

但是,当我更新数组以从结构文件中恢复数组时,我只得到一个包含两个运行标题的页面,即“Run1Run 2”

let pages: [String] = [run.runTitle]
            
            for text in pages {
                let vc = TextViewController(with: text)
                myControllers.append(vc)
            }

我想像第一部分一样为每个运行标题单独设置页面,我做错了什么?

附加代码:

import UIKit

var runs = [Run]()

class ViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
    // return the VC to be shown based on current position
        func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
            // find index in array
            guard let index = myControllers.firstIndex(of: viewController), index > 0 else {
                return nil
            }
            let before = index - 1
            
            return myControllers[before]
        }
        func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
                // find index in array
            guard let index = myControllers.firstIndex(of: viewController), index < (myControllers.count - 1) else {
                    return nil
                }
                let after = index + 1
                
                return myControllers[after]
        }
        
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
         
            DispatchQueue.main.asyncAfter(deadline: .now(), execute: { self.presentPageVC()})
        }

        // create property of array objects
        var myControllers = [UIViewController]()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            if let savedRuns = Run.loadRuns() {
                runs = savedRuns
            }
            
            let pages: [String] = [run.runTitle]
            
            for text in pages {
                let vc = TextViewController(with: text)
                myControllers.append(vc)
            }
        }

        func presentPageVC() {
            guard let first = myControllers.first else {
                return
            }
            
            let vc = UIPageViewController(transitionStyle: .pageCurl, navigationOrientation: .horizontal, options: nil)
            
            // set up datasources
            vc.delegate = self
            vc.dataSource = self
            
            vc.setViewControllers([first], direction: .forward, animated: true, completion: nil)
            
            present(vc, animated: true)
        }

    }

【问题讨论】:

  • 什么是runTitle
  • 如果这两个代码sn-ps之间的唯一区别是第一行,那么当你为run.runTitle设置断点时你会看到什么? ["Run1","Run2"] 或 ["Run1Run2"]`?
  • 实际上,是的,就像其他评论所问的那样,请给我们更多关于 run.runTitle 是什么的信息。
  • 嘿@GabrielPires 和 dfd runTitle 只是一个字符串,例如“穿过市中心”。因此我可以输入 ["Run through City Centre","Run through Street X"]。在我存储的数组中,我有两个数组项“穿过市中心”和“穿过 X 街”。但是,当我尝试使用 run.runTitle 将它们带回来时,我希望它们是分开的,但它们是合并的。我在文件顶部有 var runs = [Run]()。
  • 也许我需要在 let pages 中创建一个循环: [String] = ["","",""] 我一次拉出一个数组?阻止它把一切都带回来?我该怎么做?

标签: arrays swift xcode uiviewcontroller swift5


【解决方案1】:

let pages: [String] = [run.runTitle] 只会返回一个包含单个字符串的数组。

您有 savedRunsrun,这是一个 Run 对象数组。

您需要遍历这些 Run 对象数组并从中获取信息。

例如,如果你想得到一个运行标题的数组,你可以使用map方法来帮助(documentation on map

let pages: [String] = runs.map({$0.runTitle})

这将返回一个字符串数组。它基本上会遍历 runs 数组并返回每个 run.runTitle 的数组。

这和这个是一回事:

var pages: [String] = []
for run in runs {
    pages.append(run.runTitle)
}

现在,如果您想取回多个项目,您可以执行以下操作:

let pages: [String] = runs.map({$0.runTitle + $0.runNotes})

or

var pages: [String] = []
for run in runs {
    pages.append(run.runTitle + run.runNotes)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多