如何将数据从一个视图控制器传递到另一个 SWIFT

2024-03-05

我正在制作一个应用程序,其中带有搜索栏和范围栏的表格视图必须连接到详细视图控制器,并且该详细视图控制器必须根据选择的单元格显示数据。我有一个数组,其中设置了用于排序和搜索项目的结构。我需要保留此功能,我的详细视图控制器有另一个 swift 类,我将在其中放入 if/else 语句来处理基于哪个单元格显示数据 我选择。我需要知道如何做是将一个变量附加到单元格并将该变量传递到详细视图控制器以在我的 if/else 语句中使用,以便我可以显示数据。如果这不是正确的方法,请告诉我。

结构代码

struct Booth {
    let category : String
    let name : String
}

表视图控制器代码

import UIKit

class BoothsTableViewController: UITableViewController {    

var booths = [Booth]()
var filteredBooths = [Booth]()

override func viewDidLoad() {
    super.viewDidLoad()

    //fill array with data
    self.booths = [Booth(category: "Tech", name: "Conference App"),
        Booth(category: "Tech", name: "Space Shooter"),
        Booth(category: "Tech", name: "RollABall"),
        Booth(category: "Animation", name: "Sugar Hill City Model"),
        Booth(category: "Animation", name: "3D Sculpting 101"),
        Booth(category: "Animation", name: "HowTo - Texture"),
        Booth(category: "Science", name: "AP Biology for Dummies"),
        Booth(category: "Science", name: "Cells"),
        Booth(category: "Science", name: "Space")]

    //reload the table
    self.tableView.reloadData()
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if tableView == self.searchDisplayController!.searchResultsTableView {
        return self.filteredBooths.count
    } else {
        return self.booths.count
    }
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    //ask for a reusable cell from the tableview, the tableview will create a new one if it doesn't have any
    let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell

    var boothsCheck : Booth
    // Check to see whether the normal table or search results table is being displayed and set the Booth object from the appropriate array
    if tableView == self.searchDisplayController!.searchResultsTableView {
        boothsCheck = filteredBooths[indexPath.row]
    } else {
        boothsCheck = booths[indexPath.row]
    }

    // Configure the cell
    cell.textLabel.text = boothsCheck.name
    cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator

    return cell
}

func filterContentForSearchText(searchText: String, scope: String = "All") {
    self.filteredBooths = self.booths.filter({( Booth : Booth) -> Bool in
        var categoryMatch = (scope == "All") || (Booth.category == scope)
        var stringMatch = Booth.name.rangeOfString(searchText)
        return categoryMatch && (stringMatch != nil)
    })
}

func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchString searchString: String!) -> Bool {
    let scopes = self.searchDisplayController!.searchBar.scopeButtonTitles as [String]
    let selectedScope = scopes[self.searchDisplayController!.searchBar.selectedScopeButtonIndex] as String
    self.filterContentForSearchText(searchString, scope: selectedScope)
    return true
}

func searchDisplayController(controller: UISearchDisplayController!,
    shouldReloadTableForSearchScope searchOption: Int) -> Bool {
        let scope = self.searchDisplayController!.searchBar.scopeButtonTitles as [String]
        self.filterContentForSearchText(self.searchDisplayController!.searchBar.text, scope: scope[searchOption])
        return true
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.performSegueWithIdentifier("BoothDetail", sender: tableView)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "BoothDetail" {

        let BoothDetailViewController = segue.destinationViewController as UIViewController


        if sender as UITableView == self.searchDisplayController!.searchResultsTableView {
            let indexPath = self.searchDisplayController!.searchResultsTableView.indexPathForSelectedRow()!
            let destinationTitle = self.filteredBooths[indexPath.row].name
            BoothDetailViewController.title = destinationTitle


    } else {

            let indexPath = self.tableView.indexPathForSelectedRow()!
            let destinationTitle = self.booths[indexPath.row].name
            BoothDetailViewController.title = destinationTitle
            }
        }
    }
}

转接代码

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "BoothDetail" {

        let BoothDetailViewController = segue.destinationViewController as UIViewController


        if sender as UITableView == self.searchDisplayController!.searchResultsTableView {
                let indexPath = self.searchDisplayController!.searchResultsTableView.indexPathForSelectedRow()!
                let destinationTitle = self.filteredBooths[indexPath.row].name
                BoothDetailViewController.title = destinationTitle        
        } else {            
                let indexPath = self.tableView.indexPathForSelectedRow()!
                let destinationTitle = self.booths[indexPath.row].name
                BoothDetailViewController.title = destinationTitle
            }
        }
    }
}

例如,在你的BoothsTableViewController创建保存当前选定展位的变量,您可以在其中分配该展位didSelectRowAtIndexPath。然后,您可以将此变量传递给您的详细视图控制器prepareForSegue method.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将数据从一个视图控制器传递到另一个 SWIFT 的相关文章

  • 方法调用中的插入符[重复]

    这个问题在这里已经有答案了 我正在阅读本教程 并遇到了这行代码 这让我感到困惑 localSearch startWithCompletionHandler MKLocalSearchResponse response NSError er
  • 从 AVAudioRecorder 获取分贝

    我正在尝试从 AVAudio 录音机获取分贝值 这是我目前的代码 我有一个启动录音机的方法 然后是一个读取分贝值的方法 var recorder AVAudioRecorder 全局定义的记录器 然后在此处使用 func init reco
  • 使用 iPhone 控制蓝牙音频设备

    我正在寻找为 iPhone 编写应用程序 它将能够控制汽车中的收音机和 CD 播放器 收音机和播放器具有可用的蓝牙连接 我开始这个问题是为了获得这个地方所需的所有信息 我有几个问题 但如果您发现任何我没有要求的对我开始开发此应用程序不重要的
  • 将 Xcode 4.5 新 XIB 文件恢复到 iOS<6

    我已经安装了Xcode 4 5 with iOS6 SDK以及其他用于测试目的的旧 SDK 从 4 3 到 6 0 很美 但是有一个BIG问题 生成一个新的 XIB 文件以兼容 iOS6 这是一个问题 因为我的应用程序需要运行在旧设备 不只
  • 如何使用存储在 Cocoa Touch 框架中的 Localized.strings?

    我想为 CocoaTouch 框架添加多语言支持 问题 可本地化的字符串我创建的文件仅被使用NSLocalizedString当它是主应用程序及其目标的一部分时 我想将其存储在框架内以将事物分开 我怎样才能使用可本地化的字符串当放置在 Co
  • swift 中闭包和函数作为参数的区别

    我有将近 4 年的 Objective C 经验 并且是 swift 的新手 我试图从 Objective C 的角度理解 swift 的概念 所以如果我错了 请指导我 在目标 c 中 我们有块 可以稍后异步执行的代码块 这绝对是完全合理的
  • 如何快速防止标签中出现孤儿?

    我有一个可以有一两行的标签 如果它有两行 我希望第二行至少有两个 或者可能三个 单词 而不仅仅是一个 关于如何使用 swift 实现这一点有什么想法吗 提前致谢 Daniel 编辑 我删除了我愚蠢的第一个想法 这些想法并没有真正的帮助 好吧
  • Mapkit 在 IOS 13 中使用过多的 CPU

    最近 在一些用户更新到 iOS 13 x 后 我的 iOS 应用程序开始频繁崩溃 在 iOS 12 x 中没有出现该问题 我正在使用 Mapkit 渲染一些 MKPolygons 和 MKPolylines MKPolylines 被删除并
  • Xcode 11 无法识别静态库的架构:MacCatalyst(又名 UIKitForMac)

    在对 2019 年 WWDC 公告感到兴奋之后 我尝试使用 Xcode 11 0 beta 针对 MacOS 编译现有的 iOS 应用程序 不幸的是 事情并没有按预期进行 Xcode 说我的静态库是为 架构构建的 为 Mac 版 UIKit
  • 如何检测 iOS 8 上的包含应用程序是否启用了应用程序扩展?

    我正在 iOS 8 beta 上开发一个自定义键盘 我想告诉用户如果我的自定义键盘未启用 如何在包含应用程序中启用它 有什么方法可以检测应用程序扩展是否已启用 首先让我们设置一些常量 以便于彼此理解 包含应用程序 安装扩展并保存扩展二进制文
  • 如何在 swift 中以编程方式使用坐标打开地图应用程序?

    我想在地图应用程序中打开纬度和经度 我尝试了这段代码HERE https stackoverflow com questions 12504294 programmatically open maps app in ios 6 func g
  • 无法识别的选择器调用静态 iOS 库中的类别方法

    我正在使用一些第三方软件来帮助使用 Xcode 4 3 2 编写 iPad 应用程序 该软件是开源的 通常经过设置 因此其代码将与开发人员为应用程序编写的任何代码一起编译 因为我在很多地方使用该软件 所以我决定将其构建为 iOS 模拟器的静
  • iOS JPEG 图像旋转 90 度

    我正在使用选择器视图从相册中选择图像 我使用上面的代码 void imagePickerController UIImagePickerController picker didFinishPickingMediaWithInfo NSDi
  • 尝试注册 RCTBridgeModule 类 RCTFileReaderModule

    尝试为名称 FileReaderModule 注册 RCTBridgeModule 类 RCTFileReaderModule 但该名称已由类 FileReaderModule 注册 尝试使用命令react native run ios在i
  • TableView 中图像的大小不正确

    我正在使用来自 URL 的图像创建一个表视图 但图像不会调整到所有视图的大小 直到我将其按入行中 知道为什么会发生这种情况吗 这是一个自定义的表格视图 我的代码是 UITableViewCell tableView UITableView
  • SwiftUI - 从 NSObject 继承的 ObservableObject 在 iOS 13 中不会更新

    我知道 这是 无法在 iOS XX 中工作 问题之一 但我完全陷入困境 所以我有一个ObservableObject继承自的类NSObject 因为我需要听委托方法UISearchResultsUpdating class SearchBa
  • 使用 NSFileHandle 覆盖数据

    使用 NSFileHandle 使用 truncateFileAtOffset 从文件末尾删除 n 个字符非常容易 void removeCharacters int numberOfCharacters fromEndOfFile NSF
  • iOS 键盘显示后分屏宽度

    我刚刚开始研究 Cordova 应用程序对分屏多任务处理的支持 到目前为止 该应用程序在模拟器中的 iPad 上显示和调整大小都很好 但是当我单击编辑字段并显示软件键盘时 100 宽度的值开始返回整个屏幕 而不是给出的窗口 初始显示 到目前
  • UIApplication.shared.delegate 相当于 SceneDelegate xcode11?

    我在 SceneDelegate 中定义了一个 let 属性 我希望一些 ViewController 能够在场景中访问它 在 UIKit 中 我可以像这样访问 App Delegate 属性 UIApplication shared de
  • 如何像谷歌日历一样将单元格的内容滚动到表格视图中的另一个单元格中?

    我希望用户界面像谷歌日历那样进入桌面视图 它在不同的行中显示相同的日期事件 但是当您向上或向下滚动时 左侧的日期也会向上向下滚动 Can you please help me how to achieve this Please take

随机推荐

  • 在 Android 中向 AlertDialog 添加垂直滚动条?

    我想向 AlertDialog 添加一个垂直滚动条 因为我的文本太长 无法在一个屏幕上显示 我尝试过使用 android scrollbars vertical android scrollbarAlwaysDrawVerticalTrac
  • 顺序和并行版本给出不同的结果 - 为什么?

    我有一个嵌套循环 L 和 A 是完全定义的输入 pragma omp parallel for schedule guided shared L A reduction dummy for i k 1 i
  • 使用 compose 重新创建命名卷

    V renew anon volumes Recreate anonymous volumes instead of retrieving data from the previous containers Does docker comp
  • 如何在单击该图像的 onclick 事件时获取图像源路径

    当图像的 onclick 事件被触发时 我需要获取图像源 我尝试使用 document getElementById example src 但浏览器上的控制台显示 未捕获的类型错误 无法读取 null 的属性 src img src em
  • NamedPipeServerStream 接收 MAX=1024 字节,为什么?

    我正在使用 NamedPipeStream 客户端和服务器 我将数据从客户端发送到服务器 该数据是一个包含二进制数据的序列化对象 当服务器端接收数据时 它总是有最大1024大小 而客户端发送更多 因此 当尝试序列化数据时 这会导致以下异常
  • 可定制的字母替换器

    我一直在开发一个几乎可以替代字母的应用程序 所以你会有一封信和一个输入框 该字母代表将被替换的字母 您在输入框中写下您想要替换的内容 为此 我使用了正则表达式和对象 如果你像这样徘徊 匿名的 到底出了什么问题 julianavar 有什么不
  • 禁用 TabLayout 中的选项卡[重复]

    这个问题在这里已经有答案了 我用过TabLayout来自我的应用程序中最新的设计支持库 这些选项卡附加到一个视图分页器 该视图分页器加载每个选项卡的片段 我想禁用所有选项卡 直到视图页面加载用户选择的选项卡的片段 我无法禁用选项卡布局或使其
  • 使用 EPPlus 将 Excel 工作表格式化为表格

    我有一个 NET Core 应用程序 并且我不熟悉将 EPPlus 库与 C 一起使用 我有一个数据表 其中填充了我目前正在使用 EPPlus 将其插入到 Excel 工作表中的数据 我想知道是否有一种方法可以在将数据添加到工作表之后而不是
  • CUDA PTX 代码 %envreg<32> 特殊寄存器

    我尝试使用 CUDA 驱动程序 API 运行由 cl 内核生成的 PTX 汇编代码 我采取的步骤是这些 标准 opencl 程序 1 加载 cl内核 2 JIT编译 3 获取编译好的ptx代码并保存 到目前为止 一切都很好 我注意到 ptx
  • 在 Mobile Safari 上调试缓慢的 Angular-ui-router 状态更改

    我正在编写一个角度应用程序 使用 Angular ui router 来管理状态 路由 在桌面浏览器 Chrome Safari 上 这工作正常 然而 在 iPhone 4 上的 IOS 6 上的 Mobile Safari 上 以及 iP
  • 使用 WebBrowser .NET 控件放大网页

    IE7 中内置了 缩放 功能 显示在状态栏中 允许您放大至 400 我在演示 模拟应用程序中使用 WebBrowser NET 控件 并且需要放大网页 这是可能吗 我不想简单地拍摄页面照片并将其放大 因为我需要使用页面上的链接和按钮 如果重
  • Angular 6 - 无法解析AppComponent的所有参数

    我正在尝试使用 Angular 6 构建一个应用程序 但我仍在设置一切 但我的应用程序中的依赖注入似乎有问题 它无法解析任何构造函数参数 它们都导致Uncaught Error Can t resolve all parameters fo
  • Heroku 不支持 Neo4j?

    我正在尝试使用 Neo4j 数据库部署 Spring boot 应用程序 但是当我在 Heroku 中找到插件时 我看不到它 如何将 Neo4j 数据库推送到 Heroku 请帮我 先感谢您 This news https docs gra
  • JTable - 复合编辑器焦点

    我有一个由多个组件组成的自定义编辑器 就像是 class MyCellEditor extends AbstractCellEditor implements TableCellEditor JTextArea textArea JButt
  • 如何配置 Hibernate、Spring 和 Apache dbcp 进行连接池?

    我在集成 Spring Hibernate 和 Apache DBCP 时遇到问题 我已经用过DBCPConnectionProvider from here http wiki apache org commons DBCP Hibern
  • 西班牙 Windows 的字符集

    西班牙 Windows 的字符集是什么 Spanish es iso 8859 1 windows 1252
  • 有没有自动更新Javadoc的工具?

    我工作的代码库 很混乱 这种混乱的一方面是我们有大量方法 其签名不再与关联的 Javadoc 匹配 例如 param foo public void doFoo int bar 我不喜欢生成的 Javadoc 因为它几乎总是毫无价值 但我确
  • Android - Webview进度条

    我在网络视图上方添加了进度条 每当我单击链接时 我都会使进度条可见 我想让进度条覆盖在网络视图上 并且我想显示进度条的百分比 我知道css 但我不知道如何改变android中进度条的位置
  • 如何在 Perl 中刷新反引号中的输出?

    如果我有这个 Perl 应用程序 print someshellscript sh 它会打印一堆内容并且需要很长时间才能完成 我如何在 shell 脚本执行过程中打印该输出 看起来 Perl 只会在完成时打印 someshellscript
  • 如何将数据从一个视图控制器传递到另一个 SWIFT

    我正在制作一个应用程序 其中带有搜索栏和范围栏的表格视图必须连接到详细视图控制器 并且该详细视图控制器必须根据选择的单元格显示数据 我有一个数组 其中设置了用于排序和搜索项目的结构 我需要保留此功能 我的详细视图控制器有另一个 swift