我是swift的新手,我正在使用故事板,并使用导航控制器从一个viewcontroller连接到另一个。我想将点击的图像的名称发送到下一个viewController,它在storyView中从storyView中以模态方式连接。我搜索了很多关于从oneviewcontroller传输数据到另一个与navigationcontroller模式连接的viewcontroller,但没有解决方案可用。如果需要任何代码,请告诉我,因为我不知道如何继续它。我知道这可能是最愚蠢的问题,但在网上搜索后发布了这个问题。
根据@uraimo回复编辑。
我是否需要为在故事板上创建的每个segue提供名称? 我在viewcontrollerA上有2个固定图像,我已经放置了一个透明背景的uibutton,每个都没有文本,然后按住Ctrl键拖动到viewcontrollerB的导航控制器,用于呈现模态并展开后退按钮,即UIBarButtonItem到viewcontrollerA通过ctrl拖动viewcontrollerB的后退按钮退出viewcontrollerB并展开它。
这是我从任何图像创建导航的方法,从viewcontrollerA的3个图像中点击到viewcontrollerB,然后在viewcontrollerB的后退按钮上返回viewcontrollerA。 如果我做错了什么,请告诉我你的prepareForSegue代码是否有助于完成我的任务。
答案 0 :(得分:4)
基本上,无论是使用IB还是以编程方式执行,都必须在执行segue之前配置新的viewcontroller以及所需的所有数据(或者通过代码显示控制器)。
在您的情况下,只需在当前视图控制器类中设置图像名称(您的自定义视图控制器类 YourViewController 应具有保存此值的特定String属性)覆盖prepareForSegue
:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "yourModalSegueIdentifier" {
let imgName= (sender as! UIImageView)
let destination = segue.destinationViewController as UINavigationController
let yourController = destination.topViewController as YourViewController
yourController.imageName= <name here>
}
}
这解决了传递数据的问题。
但是在您的情况下,您需要所单击图像的名称,并且只能通过UIGestureRecognizer向UIImageView
添加点击事件。
所以,你需要一个uigesture识别,点击将执行你创建的segue。此外,您将无法获取图片资源的名称(您使用UIImage
创建imageNamed:
时使用的名称),因为它不再可用,并且您可以使用#39 ;必须使用accessibilityIdentifier
。
这使得一切都变得更加复杂,似乎可以在图形上here和here完成大部分工作(但它并不是很清楚如何做到这一点),但它& #39;通常通过代码完成。
使用全局变量简化它:
var currentImage = ""
func viewDidLoad(){
...
...
let aTap = UITapGestureRecognizer(target: self, action: Selector("imageTapped:"))
aTap.numberOfTapsRequired = 1
//For every image, configure it with recognizer and accessibilityId:
firstImage.userInteractionEnabled = true
firstImage.addGestureRecognizer(aTap)
firstImage.accessibilityIdentifier = "firsImage"
...
}
func imageTapped(recognizer:UITapGestureRecognizer) {
let imageView = recognizer.view as! UIImageView
currentImage = imageView.accessibilityIdentifier
self.performSegueWithIdentifier("yourModalSegueIdentifier", sender: self)
}
并改变这一点:
yourController.imageName= <name here>
到此:
yourController.imageName= currentImage
<强>更新强>
是的,这是识别它们的唯一方法,每个UIStoryboardSegue
都有一个标识符。但是请记住,segues并不是从控制器转到另一个控制器的唯一方法,如果你通过编程方式完成它(没有segues)你通常会调用&#34; presentViewController&#34;。 Segues是一个故事板概念。
同样,关于segue名称/标识符,到目前为止你还不需要它,因为你从未从代码中引用过segue,你需要为prepareForSegue和performSegueWithIdentifier提供它。只需选择segue并在右侧检查器窗格中为其命名即可。
您描述的结构似乎没问题,我唯一不确定UIButtons是否真的需要,尝试使用imageview中的模态segue或直接从viewcontroller到目的地查看控制器。
更新2:
如果您正在开始并需要一个免费课程,它将教您基础知识,并且还会让您构建一些有趣的ios应用程序,我建议hackingwithswift。
答案 1 :(得分:0)
查看我的操作方式
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
switch(segue.identifier ?? "") {
case "AddItem":
let destination = segue.destination as? UINavigationController
guard let itemViewController = destination?.topViewController as? ItemViewController else {
fatalError("Unexpected destination: \(segue.destination)")
}
itemViewController.collection = collection
case "EditCollection":
guard let collectionViewController = segue.destination as? EditCollectionViewController else {
fatalError("Unexpected destination: \(segue.destination)")
}
collectionViewController.collection = collection
default:
fatalError("Unexpected Segue Identifier; \(segue.identifier)")
}
}