使用当前模态

时间:2015-10-13 09:49:13

标签: uiviewcontroller uinavigationcontroller swift2

我是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代码是否有助于完成我的任务。

2 个答案:

答案 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

这使得一切都变得更加复杂,似乎可以在图形上herehere完成大部分工作(但它并不是很清楚如何做到这一点),但它& #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

<强>更新

  • 我是否需要为在故事板上创建的每个segue提供名称?

是的,这是识别它们的唯一方法,每个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)")
      }
  }