uiviewcontroller - 使用 present modally 将数据从一个 uiviewcontroller 发送到另一个 navigationcontroller

标签 uiviewcontroller uinavigationcontroller swift2

我是 swift 的新手,我正在使用 Storyboard并使用导航 Controller 从一个 View Controller 连接到另一个 View Controller 。我想将单击的图像的名称发送到下一个 View Controller ,该 Controller 从 imageView 模态连接到 Storyboard 中。我搜索了很多有关将数据从 oneviewcontroller 传输到另一个与 navigationcontroller 模态连接的 viewcontroller 的信息,但没有可用的解决方案。请让我知道是否需要任何代码,因为我不知道如何继续使用它。我知道这可能是最愚蠢的问题,但在网上搜索了很多之后发布了这个问题。

根据@uraimo 回复进行编辑。

我是否需要为我在 Storyboard上创建的每个转场提供名称? 我在 viewcontrollerA 上有 2 个固定图像,我在每个图像上放置了一个透明背景的 uibutton 并且没有文本,然后按住 ctrl 拖动到 viewcontrollerB 的导航 Controller 以模态呈现并展开后退按钮,即 UIBarButtonItem 到 viewcontrollerA通过 ctrl 拖动 viewcontrollerB 的后退按钮退出 viewcontrollerB 并展开它。

这就是我创建导航的方式,从 viewcontrollerA 的 3 个图像中的任何一个图像单击到 viewcontrollerB,然后在单击 viewcontrollerB 的后退按钮时返回到 viewcontrollerA。 如果我做错了什么请告诉我,您的 prepareForSegue 代码对完成我的任务是否有用。

最佳答案

基本上,无论是使用 IB 还是以编程方式执行此操作,都必须在执行 segue(或通过代码呈现 Controller )之前使用所需的所有数据配置新的 View Controller 。

在你的情况下,只需设置图像名称(你的自定义 View Controller 类 YourViewController 应该有一个特定的 String 属性来保存这个值)覆盖当前 View 中的 prepareForSegue Controller 类:

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 来获得该名称。

因此,您需要一个手势识别,在点击时将执行您创建的转场。而且,您将无法获得图像 Assets 的名称(您使用 imageNamed: 创建 UIImage 的名称),因为它不再可用,并且你必须使用 accessibilityIdentifier

这让一切变得更加复杂,似乎大部分都可以通过图形方式完成 herehere (但不太清楚如何去做),但通常是通过代码完成。

使用全局变量稍微简化一下:

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

更新:

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

是的,这是识别它们的唯一方法,每个 UIStoryboardSegue 都有一个标识符。但请记住,segues 不是从一个 Controller 转到另一个 Controller 的唯一方法,如果您完全以编程方式进行(没有 segues),您通常会调用“presentViewController”。 Segues是一个 Storyboard概念。

同样,关于 segue 名称/标识符,您直到现在才需要它,因为您从未从代码中引用过该 segue,prepareForSegue 和 performSegueWithIdentifier 都需要它。只需选择 segue 并在右侧的检查器 Pane 中为其命名。

您描述的结构似乎没问题,唯一的问题是我不太确定是否真的需要 UIButtons,请尝试从 imageview 或直接从 viewcontroller 到目标 View Controller 的模式转场。

更新 2:

如果您刚开始,需要一门免费类(class)来教您基础知识,并让您构建一些有趣的 iOS 应用程序,我推荐 hackingwithswift .

关于uiviewcontroller - 使用 present modally 将数据从一个 uiviewcontroller 发送到另一个 navigationcontroller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33099447/

相关文章:

ios - 将 Parse.com 1.11.0 添加到 watchOS 2

iphone - 从 Controller 调用 Controller

ios - 如何从导航 Controller 一次弹出两个 View ?

uiviewcontroller - UIModalTransitionStyle和UIModalPresentationStyle有什么区别?

ios - 将值传回 DetailViewController

iphone - 如何将相同的 UIButton 添加到 iphone 中所有 View Controller 的导航栏?

ios - UITableViewRowAction 的行为不可预测

ios - 添加、重用和删除 NSLayoutAnchors

ios - 将 ViewController 的 View 分配给自定义 View 类不会显示自定义 View 属性

ios - UITableView 中的右侧细节不可见