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

ios – 在Swift中的视图控制器之间传递数据(从TableView到DetailViewController),第1张

概述我有两个文件,MyTableViewController和myViewController.我在MyTableVIewController中的TableCell上设置了UI ImageView. myViewController不包含任何内容.我创建了一个名为ImageArray的数组,其中包含一个Images数组. 我在这里要做的是当我在myTableViewController中单击Table 我有两个文件,MytableVIEwController和myVIEwController.我在MytableVIEwController中的tableCell上设置了UI ImageVIEw. myVIEwController不包含任何内容.我创建了一个名为ImageArray的数组,其中包含一个Images数组.

我在这里要做的是当我在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    }}

我不知道如何做到这一点.如果你能帮助我搞清楚,我真的很感激!谢谢!

解决方法 首先,我假设您的MytableVIEwController类符合UItableVIEwDataSource和UItableVIEwDelegate协议,并且您已将MytableVIEwController类设置为代码或通过Storyboard的委托.

经过整理,有多种方法可以实现您所寻求的结果.
您可以在一个独立的类中声明ImageArray并在MytableVIEwController类中调用它,使用tableVIEw委托方法将它们索引到tableVIEw上,最后使用prepareForSegue方法将图像推送到myVIEwController上.或者您可以在MytableVIEwController类的顶部简单地声明和初始化ImageArray,如下所示:

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

在上面的ImageArray中,确保您的图像名称与您导入Xcode项目的资产名称完全匹配.

然后我们使用下面所需的方法指定我们需要ImageArray在tableVIEw上占用多少行(即基本上将我们的ImageArray计入我们的tableVIEw):

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

接下来,您希望使用tableVIEw:cellForRowAtIndexPath:方法在单元格的每一行中显示ImageArray.

关于tableCell的附注:希望你的tableCell是UItableVIEwCell的子类,你已经分别声明和连接了两个IBOutlet,比如imageVIEw和textLabel.此外,确保您的tableCell正确地链接到IDentity Inspector下的Storyboard中的原型单元格.您的tableCell类应如下所示:

import UIKitclass CustomtableVIEwCell: UItableVIEwCell {@IBOutlet weak var imageVIEw: UIImageVIEw!@IBOutlet weak var textLabel: UILabel!}

现在回到MytableVIEwController类.从你的代码中,我看到你正在将’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}

看起来您对使用performSegueWithIDentifIEr方法的时间和位置有点困惑,而不是使用-prepareForSegue方法.甚至何时使用tableVIEw:dIDSelectRowAtIndexPath方法.

我在这里简单解释一下.当您没有控制时,可以使用performSegueWithIDentifIEr方法 – 将一个VIEwController的场景中的segue拖动到Storyboard中的另一个场景.这样,只要您指定了在“属性检查器”下的“故事板”中设置的正确标识符,使用performSegueWithIDentifIEr方法就可以在VIEwController场景之间移动.

现在,如果您使用的是Storyboard,则不需要tableVIEw:dIDSelectRowAtIndexPath方法. tableVIEw:dIDSelectRowAtIndexPath方法的作用是告诉委托现在选择了指定的行,我们可以在其代码体内执行某些 *** 作(例如将图像或文本推送到另一个VIEwController场景,就像您尝试做的那样).但是当你使用segues时,这就变得多余了.您所要做的就是控制 – 将您的MytableVIEwController场景中的表格单元格中的segue拖动到myVIEwController场景.选择“显示”并为segue指定一个标识符名称,就像你“下一步”一样. (有点注意事项:如果您希望在运行应用程序时在顶部导航栏中显示“后退”按钮功能,则只需将MytableVIEwController嵌入到UINavigationController中即可为您提供“后退”按钮功能.在Storyboard中选择MytableVIEwController场景,转到顶部菜单,然后选择编辑器>>嵌入>>导航控制器.然后walla !!)

现在让我们继续实现我们的tableVIEw: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}

从上面的代码中,确保首先在myVIEwController类中将’imagename’和’textname’设置为属性,然后才能使用’destinationVC’访问它们,而’destinationVC’现在是myVIEwController类型.这两个属性将保存我们从MytableVIEwController类传递到myVIEwController类的数据.我们正在使用数组索引相应地将数据传递给这两个属性.

然后,您可以通过将这些设置’imagename2’和’textname2’属性传递到您的出口(或任何UI控件)来创建两个IBOutlet来显示您的图像和文本.

>现在你必须先设置属性的原因
myVIEwController类在你或它周围传递之前(即到
当你从中查看tableVIEw单元格时,UI元素,闭包,另一个VC等)
MytableVIEwController场景将转移到您的下一个VIEwController
场景(即你的myVIEwController场景),iOS尚未实例化
那个第二个场景呢.所以你需要一个属性来保存数据
你试图首先传递到你的第二个场景VIEw Controller,你可以
稍后在该类最终加载时使用它.

所以你的myVIEwController类应该如下所示:

import UIKitclass myVIEwController : UIVIEwController {   //Your two strings to initially hold onto the data   //being passed to myVIEwController classvar 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中标签和约定的注意事项:

>开始用大写字母命名类(即类
VIEwController(){})
>类和属性应该捕获它们的含义
代表.我建议你改变你的MytableVIEwController
和’myVIEwController’相应地反映了他们真实的东西
意思是或做(你可以使用’MaintableVIEwController’和’DetailVIEwController’.这样做会很好).
>使用camelToe标签来表示属性和方法. (我用过你的标签
在你的问题中提供,以免过多地混淆你).

请享用!

总结

以上是内存溢出为你收集整理的ios – 在Swift中的视图控制器之间传递数据(从TableView到DetailViewController)全部内容,希望文章能够帮你解决ios – 在Swift中的视图控制器之间传递数据(从TableView到DetailViewController)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1014418.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-22
下一篇2022-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存