首先也是最重要的,我假设你的我的表视图控制器类同时符合两者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 中标签和约定的注意事项: