在 Swift 中的视图控制器之间传递数据(从 TableView 到 DetailViewController)

2023-12-14

我有两个文件,MyTableViewController 和 myViewController。我在 MyTableVIewController 中的 TableCell 上设置了 UIImageView。 myViewController 不包含任何内容。我创建了一个名为 ImageArray 的数组,其中包含图像数组。

我的目标是当我单击 myTableViewController 中的 TableCell 上的图像时,我希望单击的图像出现在 myViewController 中。在图像旁边还有一些有关单击图像的描述。我想使用 myViewController 供用户获取所选图像的详细信息。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as! UITableViewCell
    var ImageView = cell.viewWithTag(1) as! UIImageView
    ImageView.image = UIImage(named: ImageArray[indexPath.row])
    ImageView.contentMode = .ScaleAspectFit

    var TextView = cell.viewWithTag(2) as! UILabel
    TextView.text = ImageArray[indexPath.row]
    return cell
}

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

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "next") {
        let destination = segue.destinationViewController as! myViewController
    }
}

我不知道该怎么做才能实现这一点。如果您能帮我弄清楚,我真的很感激!谢谢!


首先也是最重要的,我假设你的我的表视图控制器类同时符合两者UITableView数据源 and UITableViewDelegate协议,并且您已将 MyTableViewController 类设置为代码中或通过 Storyboard 的委托。

解决了这个问题后,有多种方法可以实现您想要的结果。 您可以声明您的图像阵列在一个独立的类中并在你的内部调用它我的表视图控制器类,使用 tableView 委托方法将它们索引到 tableView 上,最后使用准备继续将图像推送到 myViewController 的方法。或者你可以简单地在你的顶部声明并初始化你的ImageArray我的表视图控制器类如下:

var ImageArray = [("Moscow Russia.jpg", "Europe"),
    ("London England.jpg", "Europe")]  

In the 图像阵列如上所述,确保您的图像名称与导入到 Xcode 项目中的资源名称完全匹配。

然后我们指定我们需要的部分中有多少行图像阵列使用以下所需方法占据我们的 tableView(即基本上将我们的 ImageArray 计入我们的 TableView):

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return ImageArray.count ?? 0
}

接下来,您要展示您的图像阵列在单元格的每一行中使用tableView:cellForRowAtIndexPath: 方法。

TableCell 上的旁注:希望您的 TableCell 是 UITableViewCell 的子类,并且您已经声明并连接了两个 IBOutlet,例如,图像视图 and 文本标签分别。另外,确保您的 TableCell 正确链接到 Storyboard 下的原型单元身份检查员)您的 TableCell 类应如下所示:

import UIKit
class CustomTableViewCell: UITableViewCell {
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var textLabel: UILabel!
}

现在回到你的我的TableView控制器班级。从您的代码中,我看到您正在将 'let cell = ...' 行转换为 'UITableViewCell.您应该将其转换为“TableCell”,因为您正在对其进行子类化。实现 tableView:cellForRowAtIndexPath: 方法如下:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{        
    let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as! TableCell

//Note that I'm using tuples here. Pretty cool huh. Got to love Swift!
  let (imageName, textNameToGoWithImage) = ImageArray[indexPath.row]

    cell.textLabel.text = textNameToGoWithImage
    cell.imageView.image = UIImage(named: imageName)
    cell.imageView.contentMode = .ScaleAspectFit

// You could have also used 'if let' in optional binding to safely unwrap your image if you want like below.
   //    if let image = UIImage(named: imageName){
   //        cell.imageView?.image = image
  //         cell.imageView.contentMode = .ScaleAspectFit
  //     }

    return cell
}

看来您对何时何地使用有点困惑使用标识符执行Segue方法而不是使用 -准备继续方法。甚至何时使用tableView:didSelectRowAtIndexPath 方法.

我在这里简单解释一下。您使用使用标识符执行Segue当您没有按住 Control 键将 Segue 从一个 ViewController 的场景拖动到 Storyboard 中的另一个场景时,请使用此方法。这样,使用使用标识符执行Segue方法将允许您在 ViewController 场景之间移动,只要您指定在 Storyboard 下设置的正确标识符即可属性检查器。'

现在,如果您使用 Storyboard,则不需要表视图:didSelectRowAtIndexPath方法。什么是表视图:didSelectRowAtIndexPath方法的作用是告诉委托现在指定的行已被选择,我们可以在其代码体内执行某些操作(例如将图像或文本推送到另一个 ViewController 场景上,就像您尝试做的那样)。但当你使用 segues 时,这就变得多余了。你所要做的就是控制拖动 a segue来自表格单元格在你的我的表视图控制器场景到你的我的视图控制器场景。选择 'Show'并给出segue an 标识符像你所做的那样命名“next". (一点旁注:如果你想要Back当您运行应用程序时,按钮功能显示在顶部导航栏,您只需嵌入您的我的表视图控制器 in a UI导航控制器给你那个'Back' 按钮功能。和你的我的表视图控制器在情节提要中选择场景,转到顶部菜单并选择编辑>>嵌入>>导航控制器。然后瓦拉!!)

现在让我们继续实施我们的表视图:prepareForSegue方法如下:

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "next" {
        //Note that, originally, destinationViewController is of Type UIViewController and has to be casted as myViewController instead since that's the ViewController we trying to go to. 
        let destinationVC = segue.destinationViewController as! myViewController


        if let indexPath = self.tableView.indexPathForSelectedRow{

            let selectedRow = ImageArray[indexPath.row]

            destinationVC.imageName2 = selectedRow.0
            destinationVC.textName2 = selectedRow.1
}

在上面的代码中,请确保设置了 '图片名称' and 'textName' as 特性在你的我的视图控制器首先类,然后才能使用 ' 访问它们目的地VC' 现在是 myViewController 类型。这两个属性将保存我们从中传递的数据我的表视图控制器上课到我的视图控制器班级。我们使用数组索引将数据相应地传递给这两个属性。

然后,您可以通过传递这些集来创建两个 IBOutlet 来显示图像和文本 '图片名称2' and '文本名称2' 属性到您的插座(或任何与此相关的 UI 控件)。

  • 现在您必须首先设置属性的原因是我的视图控制器在你将它们传递给他人或周围(即传递给 UI 元素、闭包、另一个 VC 等)是这样的,当您从我的表视图控制器场景到segue到你的下一个 ViewController 场景(即你的我的视图控制器场景),iOS尚未实例化 第二个场景还没有。所以你需要一个属性来保存数据 您试图首先传递到第二个场景视图控制器,以便您可以 稍后当该类最终加载时使用它。

So your 我的视图控制器类应该如下所示:

import UIKit

class myViewController : UIViewController {

   //Your two strings to initially hold onto the data 
  //being passed to myViewController class
var imageName2 : String?
var textName2 : String?

@IBOutlet weak var detailImageView: UIImageView!
@IBOutlet weak var detailTextNameLabel: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    detailTextNameLabel.text = textName2!

    if let image = UIImage(named: imageName2!) {
        self.detailImageView.image = image
    }
}

就是这样!

Swift 中标签和约定的注意事项:

  • 开始用大写字母命名类(即类 视图控制器() {})
  • 类和属性应该捕捉它们的含义 代表。我会建议你改变你的我的表视图控制器 and '我的视图控制器'相应地反映他们真正的课程 意味着或做(您可以使用“MainTable ViewController”和“Detail ViewController”。这样就可以了)。
  • 对属性和方法使用camelToe 标签。 (我用了你的标签 在您的问题中提供,以免让您感到太困惑)。

    Enjoy!

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

在 Swift 中的视图控制器之间传递数据(从 TableView 到 DetailViewController) 的相关文章

  • xcode 6 资产目录 iPhone 6

    这个问题还没有得到解答 使用资产目录时 特定于设备 非通用 选项为 1x 2x r 2x 3x 1x 是不必要的 因为它不是视网膜 2x 是 ip4 的最佳选择 分辨率为 640x960 r 2x 适合 ip5 分辨率为 640x1136
  • SwiftUI 检测用户何时截取屏幕截图或屏幕录制

    On UIViewController我们可以轻松地将观察者添加到控制器 喜欢 class ViewController UIViewController override func viewDidLoad super viewDidLoa
  • NSIndexpath.item 与 NSIndexpath.row

    有谁知道之间的区别NSIndexpath row and NSIndexpath item 具体来说 我在以下情况中使用哪一个 UITableViewCell tableView UITableView tableView cellForR
  • SKScene和SKView的paused属性之间的区别

    我使用以下代码暂停 SKScene self paused YES 然而 根据这个answer https stackoverflow com a 21593852 2043580 by 安德烈 戈尔杰耶夫 https stackoverf
  • 添加 AFNetworking 后出现 APPLE MACH-O 链接错误

    只是将 AFNetworking 添加到我的项目中 在 B R 后 我收到如下错误 Undefined symbols for architecture i386 SecCertificateCopyData referenced from
  • UIAlertAction 处理程序在延迟后运行

    我正在尝试将 UIAlertViews 更改为 UIAlertControllers 我为此设置了这个操作 UIAlertAction undoStopAction UIAlertAction actionWithTitle Undo St
  • 如何在 Swift 中使用 deltaTime 正确计算 1 秒

    我正在尝试计算经过的秒数deltaTime但我不知道该怎么做 因为我的deltaTime不断打印 0 0166 或 0 0167 这是我的代码 override func update currentTime CFTimeInterval
  • 如何让位置音频在 SceneKit 中工作?

    我在使位置音频在 SceneKit 中工作时遇到问题 从 Xcode 生成的 SceneKit 游戏模板开始 我将以下代码添加到handleTap 方法的末尾 let ship scnView scene rootNode childNod
  • 在后台运行 URL 请求

    我想在一定的时间间隔内发出 url 请求 例如 每 10 分钟应用程序应该发出一次 url 调用并获取一些 json 数据 应用程序在后台运行时应该能够执行此操作 这可以做到吗 如果是这样 这是否违反 Apple 服务条款 有什么限制吗 i
  • 如何在 iOS 应用程序中检测所有可用的 Wifi 网络并连接到其中之一

    在我的 iOS 应用程序中 我想检测所有可用的 wifi 网络 然后从列表中选择一个网络并连接到它 目标是不打开应用程序内置的设置来连接 Wi Fi 而是在我的应用程序中完成这一切 首先 这可能吗 如果可能的话 请指出要使用哪些框架和方法
  • 带有图像的 UITableView 滚动非常慢[重复]

    这个问题在这里已经有答案了 可能的重复 带图像的表格视图 加载和滚动缓慢 https stackoverflow com questions 4071497 table view with images slow load and scro
  • 移动设备上的 TensorFlow(Android、iOS、Windows Phone)

    我目前正在寻找不同的深度学习框架 特别是用于训练和部署卷积神经网络 要求是 它可以在带有 GPU 的普通 PC 上进行训练 但训练后的模型必须部署在三个主要的移动操作系统上 即 Android iOS 和 Windows Phone Ten
  • Xcode 服务器 ibtool 构建失败

    我一直在研究使用 Xcode Server 进行 CI 我已经解决了一些问题 但现在有一个问题困扰着我 构建似乎工作正常 但在测试阶段挂起 并在日志底部生成以下内容 2015 11 25 14 44 45 650 xcodebuild 58
  • 旋转 GPUImageTiltShiftFilter - GPUImage

    我想要一个非水平 GPUImageTiltShiftFilter 旋转 我想将其旋转到任意旋转角度 我还希望过滤器速度快 可以通过带有 UIRotationGestureRecongizer 的 UI 进行旋转 我该怎么做呢 啊 想通了 不
  • 在后台继续下载

    我正在创建一个应用程序 其中我从服务器下载一些数据 在后台运行时 我希望连接继续运行 以便可以下载数据 我知道有方法应用程序委托 void applicationDidEnterBackground UIApplication applic
  • 在 Swift 中,如何为具有自动布局的 UIView 制作动画,就像页面滑入一样?

    我尝试创建一个 UIView 来表示一个大小与设备屏幕相同的页面 由于该应用程序支持方向 因此我使用 AutoLayout 来构建它 它工作正常 直到我尝试将页面动画化以从右侧滑入 经过一番研究后 我能想到的最好的办法是 myView UI
  • 如何将NSTextView的格式化内容转换为字符串

    我需要将 NSTextView 的内容从 Mac 应用程序传输到 iOS 应用程序 我使用 XML 作为传输文件格式 所以我需要将 NSTextView 的内容 文本 字体 颜色等 保存为字符串 有什么办法可以做到这一点吗 一种方法是存档
  • 应用程序仅启用纵向,但 UIImagePickerController 在 iOS6 中旋转

    请注意 下面的答案 不适用于 iOS6 所以我仍然需要答案 我的应用程序仅启用纵向模式 但是 如果我将 UIImagePickerController 作为子视图嵌入其中 并旋转设备 则顶部和底部栏将保持在同一位置 但 UIImagePic
  • iOS 开发:如何强制 UIWebView 加载 Facebook 的非移动版本?

    我正在深入研究 iOS 开发 当我尝试在 UIWebView 中加载特定的 Facebook 粉丝页面时 它会加载该网站的移动版本 该版本仅加载粉丝页面的墙 而不是我需要加载的特定选项卡 在我的应用程序的 iPad 版本中 UIWebVie
  • GCD 与自定义队列

    我想知道这两者的性能有什么区别 dispatch async dispatch get global queue DISPATCH QUEUE PRIORITY HIGH 0 perform complex operation dispat

随机推荐