如何在快速弹出视图控制器后传递数据

2023-12-30

我正在制作一个关于书籍的应用程序。 在应用程序中, 我想让应用程序通过获取 ISBN(条形码)自动填充图书信息

views https://i.stack.imgur.com/ohz2S.png

有2个班。 一个是“UploadMain”,另一个是“ScanView”

我可以通过扫描获取ISBN, 但我在将数据从 ScanView 传递到 UploadMain 时遇到问题。

在 ScanView 中,我使用了如下所示的可选绑定

if let UploadVC = self.storyboard?.instantiateViewControllerWithIdentifier("UploadMain") as? UploadMain {
     UploadVC.ISBNstring = self.detectionString!
}

UploadMain类的代码

override func viewDidLoad(){
    super.viewDidLoad()
    ISBN.delegate = self

}

override func viewWillAppear(animated: Bool){
    ISBN.text = ISBNstring
}

我不知道我的代码有什么问题。

完整代码上传主

import UIKit
import Foundation

class UploadMain: UIViewController,UITextFieldDelegate {


var ISBNstring: String = ""
var TitleString: String = ""
var AuthorString: String = ""
var PubString: String = ""
var PriceSting: String = ""

@IBOutlet weak var ISBN: UITextField!

@IBOutlet weak var bookTitle: UITextField!

@IBOutlet weak var bookAuthor: UITextField!

@IBOutlet weak var bookPub: UITextField!

@IBOutlet weak var bookPrice: UITextField!



override func viewDidLoad(){
    super.viewDidLoad()
    ISBN.delegate = self
}

override func viewWillAppear(animated: Bool){
    ISBN.text = ISBNstring
}



@IBAction func Upload(sender: AnyObject) {
    dismissViewControllerAnimated(true, completion: nil)
}
}

扫描视图类

import UIKit
import AVFoundation
import Foundation


class ScanView : UIViewController, AVCaptureMetadataOutputObjectsDelegate {



let session         : AVCaptureSession = AVCaptureSession()
var previewLayer    : AVCaptureVideoPreviewLayer!
var detectionString : String!
let apiKey : String = "---------dddddd"


override func viewDidLoad() {
    super.viewDidLoad()

    // For the sake of discussion this is the camera
    let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

    // Create a nilable NSError to hand off to the next method.
    // Make sure to use the "var" keyword and not "let"
    var error : NSError? = nil
    var input: AVCaptureDeviceInput = AVCaptureDeviceInput()
    do {
        input = try  AVCaptureDeviceInput(device: device) as AVCaptureDeviceInput
    } catch let myJSONError {
        print(myJSONError)
    }

    // If our input is not nil then add it to the session, otherwise we're kind of done!
    if input !=  AVCaptureDeviceInput() {
        session.addInput(input)
    }
    else {
        // This is fine for a demo, do something real with this in your app. :)
        print(error)
    }

    let output = AVCaptureMetadataOutput()
    output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
    session.addOutput(output)
    output.metadataObjectTypes = output.availableMetadataObjectTypes


    previewLayer = AVCaptureVideoPreviewLayer(session: session)
    previewLayer.frame = self.view.bounds
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
    self.view.layer.addSublayer(previewLayer)

    // Start the scanner. You'll have to end it yourself later.
    session.startRunning()

}



// This is called when we find a known barcode type with the camera.
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {

    var highlightViewRect = CGRectZero
    var barCodeObject : AVMetadataObject!
    let barCodeTypes = [AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code]


    // The scanner is capable of capturing multiple 2-dimensional barcodes in one scan.
    for metadata in metadataObjects {

        for barcodeType in barCodeTypes {

            if metadata.type == barcodeType {
                barCodeObject = self.previewLayer.transformedMetadataObjectForMetadataObject(metadata as! AVMetadataMachineReadableCodeObject)

                highlightViewRect = barCodeObject.bounds

                detectionString = (metadata as! AVMetadataMachineReadableCodeObject).stringValue

                self.session.stopRunning()

                self.alert(detectionString)

                // Daum Book API 호출
                let apiURI = NSURL(string: "https://apis.daum.net/search/book?apikey=\(apiKey)&q=\(detectionString)&searchType=isbn&output=json")

                let apidata : NSData? = NSData(contentsOfURL: apiURI!)

                NSLog("API Result = %@", NSString(data: apidata!, encoding: NSUTF8StringEncoding)!)

                **if let UploadVC = self.storyboard?.instantiateViewControllerWithIdentifier("UploadMain") as? UploadMain {
                    UploadVC.ISBNstring = self.detectionString!
                }**

                break
            }

        }
    }

    print(detectionString)
    self.navigationController?.popViewControllerAnimated(true)

}



func alert(Code: String){
    let actionSheet:UIAlertController = UIAlertController(title: "Barcode", message: "\(Code)", preferredStyle: UIAlertControllerStyle.Alert)

    // for alert add .Alert instead of .Action Sheet
    // start copy
    let firstAlertAction:UIAlertAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler:
        {
            (alertAction:UIAlertAction!) in

            // action when pressed
            self.session.startRunning()
    })


    actionSheet.addAction(firstAlertAction)

}

}

In the ScanView您正在创建的新实例UploadMain,这在窗口层次结构中不可用,因此数据不可用于UploadMain。为了解决您的问题,您需要创建一个protocol并将该协议的委托传递给ScanView。所以创建一个protocol像这样。

protocol IsbnDelegate {
    func passData(isbnStr: String)
}

现在继承这个协议UploadMain并重写它的方法passData in the UploadMain像下面这样

class UploadMain: UIViewController,UITextFieldDelegate,IsbnDelegate  {

     //your code

     //Add this method 
     func passData(isbnStr: String) {
          self.ISBN.text = isbnStr
     }

     //Also override prepareForSegue like this 

     override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
          let destVC = segue.destinationViewController as! ScanView
          destVC.delegate = self
     }
}

之后创建一个delegate对象在ScanView,更改您的代码ScanView像这样

import UIKit
import AVFoundation
import Foundation


class ScanView : UIViewController, AVCaptureMetadataOutputObjectsDelegate {



let session         : AVCaptureSession = AVCaptureSession()
var previewLayer    : AVCaptureVideoPreviewLayer!
var detectionString : String!
let apiKey : String = "---------dddddd"
var delegate: IsbnDelegate?

override func viewDidLoad() {
    super.viewDidLoad()

    // For the sake of discussion this is the camera
    let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

    // Create a nilable NSError to hand off to the next method.
    // Make sure to use the "var" keyword and not "let"
    var error : NSError? = nil
    var input: AVCaptureDeviceInput = AVCaptureDeviceInput()
    do {
        input = try  AVCaptureDeviceInput(device: device) as AVCaptureDeviceInput
    } catch let myJSONError {
        print(myJSONError)
    }

    // If our input is not nil then add it to the session, otherwise we're kind of done!
    if input !=  AVCaptureDeviceInput() {
        session.addInput(input)
    }
    else {
        // This is fine for a demo, do something real with this in your app. :)
        print(error)
    }

    let output = AVCaptureMetadataOutput()
    output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
    session.addOutput(output)
    output.metadataObjectTypes = output.availableMetadataObjectTypes


    previewLayer = AVCaptureVideoPreviewLayer(session: session)
    previewLayer.frame = self.view.bounds
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
    self.view.layer.addSublayer(previewLayer)

    // Start the scanner. You'll have to end it yourself later.
    session.startRunning()

}



// This is called when we find a known barcode type with the camera.
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {

    var highlightViewRect = CGRectZero
    var barCodeObject : AVMetadataObject!
    let barCodeTypes = [AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code]


    // The scanner is capable of capturing multiple 2-dimensional barcodes in one scan.
    for metadata in metadataObjects {

        for barcodeType in barCodeTypes {

            if metadata.type == barcodeType {
                barCodeObject = self.previewLayer.transformedMetadataObjectForMetadataObject(metadata as! AVMetadataMachineReadableCodeObject)

                highlightViewRect = barCodeObject.bounds

                detectionString = (metadata as! AVMetadataMachineReadableCodeObject).stringValue

                self.session.stopRunning()

                self.alert(detectionString)

                // Daum Book API 호출
                let apiURI = NSURL(string: "https://apis.daum.net/search/book?apikey=\(apiKey)&q=\(detectionString)&searchType=isbn&output=json")

                let apidata : NSData? = NSData(contentsOfURL: apiURI!)

                NSLog("API Result = %@", NSString(data: apidata!, encoding: NSUTF8StringEncoding)!)


                //Here We are passing the data of your ScanView to UploadMain
                self.delegate.passData(self.detectionString!)

                break
            }

        }
    }

    print(detectionString)
    self.navigationController?.popViewControllerAnimated(true)

}



func alert(Code: String){
    let actionSheet:UIAlertController = UIAlertController(title: "Barcode", message: "\(Code)", preferredStyle: UIAlertControllerStyle.Alert)

    // for alert add .Alert instead of .Action Sheet
    // start copy
    let firstAlertAction:UIAlertAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler:
        {
            (alertAction:UIAlertAction!) in

            // action when pressed
            self.session.startRunning()
    })


    actionSheet.addAction(firstAlertAction)

}

}

有关更多详细信息protcol点击此链接

1) 苹果文档 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html
2) 教程1 http://www.tutorialspoint.com/swift/swift_protocols.htm
3) 教程2 http://codewithchris.com/learn-swift-from-objective-c-part3/

希望对你有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在快速弹出视图控制器后传递数据 的相关文章

  • `navigator.geolocation.getCurrentPosition()` 在 iOS PWA 上挂起

    我有这个片段 const getCurrentPosition gt new Promise
  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • Objective-C UILabel 作为超链接

    我正在尝试做一个UILabel一个链接UIWebView 我怎样才能做一个UILabel作为超链接 您可以使用 UITapGestureRecognizer 它将实现与您想要的类似的功能 UILabel myLabel UILabel al
  • iOS 中 NSDecimalNumber 的小数分隔符错误

    我尝试通过以下方式输出具有正确的小数分隔符的十进制数的描述 NSString strValue 9 94300 NSDecimalNumber decimalNumber NSDecimalNumber decimalNumberWithS
  • CALayer边框奇怪问题

    我正在向 CALayer 添加边框 但有一些奇怪的行为 在我应用的边框之后出现模糊边框 参见屏幕截图 这是我的代码 void configureLabel self hidden YES self textAlignment NSTextA
  • ios swift parse:从 3 个类收集数据

    我有这样的结构 User CardSet 带有指向 User objectId 的指针 user 和 col name 带有点 cards 的卡片到 Card Set objectId 和列 name 我想选择所有卡数据 包括当前用户的卡集
  • dyld:无法加载插入的库

    当我尝试运行 UI 和单元测试时 出现异常 dyld 无法加载插入的库 private var containers Bundle Application AutoTestingApp app Frameworks IDEBundleInj
  • iOS:生成pdf时绘制文本时如何设置字体?

    我在ios应用程序中使用drawpdf函数生成pdf 同时调用nsobject类中的drawtext函数 它根据我指定的框架和字符串清楚地绘制文本 我的代码是 void drawText NSString textToDraw inFram
  • 为什么 iOS 启动屏幕很慢?

    我的 iOS 应用程序启动屏幕大约需要 3 5 秒 我有一张将在启动屏幕后加载的地图 我的用户必须等待启动屏幕加载 然后再等待 3 秒才能加载地图 有没有办法最大限度地减少启动屏幕时间 基本上这种延迟意味着you在启动过程中做了一些非常错误
  • 如何在 Swift 中从 UIColor 获取 RGB 代码(INT)[重复]

    这个问题在这里已经有答案了 我想在 Swift 中获取 UIColor 的 RGB 值 let swiftColor UIColor red 1 green 165 255 blue 0 alpha 1 println RGB Value
  • 如何让UITextView背景线与文字对齐?

    我正在尝试绘制 UITextView 的背景线 这是我用来画这些线的代码 CGContextBeginPath context CGContextSetStrokeColorWithColor context self horizontal
  • 如何向标准 UIButton 添加徽章? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以在标准中添加看起来标准的徽章UIButton 如果不支持半原生 那么实现此目的最简单的方法是什么 示例图片 这是 Sascha
  • 如何解决 Xcode 5 中的红色(已移动)文件?

    在 Xcode 4 中 当您要移动文件时 可以通过单击右侧菜单中的按钮并通过 Finder 选择新位置来解析文件的新位置 在 Xcode 5 中 右侧菜单中没有按钮 我还没有找到任何方法通过右键单击文件或顶部菜单栏选项来指定文件的新位置 在
  • UIView 圆角 - Swift 2.0?

    我会尝试将一些项目更新到 Swift 2 0 我有一个视图 左上角有一个圆角 在 Swift 没有警告 没有错误 只是没有圆角 这就是它在 Swift let maskPath UIBezierPath roundedRect conten
  • Firebase ref.removeAllObservers() 是否也会递归删除子观察者?

    我看到了一些与此相关的问题 但没有一个真正证实了我的疑问 If I removeAllObservers 在父节点上 这是否也会递归地删除可能已附加在所有子节点和子节点的子节点等处的所有其他观察者 递归地 API 文档为removeAllO
  • 在 Swift 中从 Parse 加载图像

    我成功地将数据从 Parse 提取到 swift 中 但我的图像似乎没有按照我的方式工作 在我的 cellForRowAtIndexPath 方法中 我执行以下操作 var event AnyObject eventContainerArr
  • iPhone 上的纵向 UISplitViewController 在 iOS 8 中始终显示主视图和细节视图

    UISplitViewController in portrait在 iPhone 上始终显示主控和细节iOS 8 我尝试子类化UISplitViewController并将其配置为同时显示主视图和细节视图 但没有任何效果 class AP
  • 像 TraceGL 一样分析 Objective C 中的代码路径?

    TraceGL 是一个非常简洁的项目 它允许 JS 程序员跟踪 Javascript 中的代码路径 它看起来像这样 我想为 Objective C 构建类似的东西 我知道运行时使跟踪方法调用变得相当容易 但是我如何跟踪控制流 例如 在上面的
  • 更改 iOS7 中 UIAlertView 的字体大小

    我想更改alertView中消息文本和标题文本的字体大小 苹果网站上没有任何文档谈到这一点 但苹果在其子类注释中表示 UIAlertView 类旨在按原样使用 请参考以下链接 https developer apple com librar
  • 隐藏选项卡栏项目并对齐其他选项卡项目

    在我的应用程序中 我有 4 个选项卡栏项目 我正在 XIB 文件中添加这 4 个选项卡栏项目 最初我必须显示 3 个选项卡栏项目 同步后我必须在我的应用程序中显示第 4 个选项卡栏项目 因此 为此 我使用以下代码隐藏第四个选项卡栏项目 se

随机推荐

  • 如何在apache solr中以原始嵌套形式检索json?

    我在用阿帕奇 索尔 for 文本搜索 我有nested document structure 这是one json file id 1 info first name John last name Doe gender male 我创建了一
  • 将项目与 Eclipse 中的 Sonar 关联

    我有 Eclipse Indigo 3 7 基础和 MyEclipse 10 Java 企业开发插件 我已经为eclipse安装了Sonar插件 安装 Sonar 服务器并从本地主机 localhost 9000 本地运行它 在 Eclip
  • 并行调用 API,每分钟有硬性限制

    我正在尝试对 API 进行并行调用 在停止之前 API 的调用限制为每分钟 1 200 次 在低于限制的情况下异步最有效的方法是什么 def remove html tags text Remove html tags from a str
  • pip for python3.7 (Ubuntu 16.04) [重复]

    这个问题在这里已经有答案了 我无法为 python 3 7 安装 pip 当我尝试在线搜索时 我找到的一种解决方案是使用 get pip py 安装 pip 然而 它对我来说失败了 sudo python3 7 get pip py Tra
  • 如何使谷歌地图响应式?

    我正在尝试将 Google 地图添加到网页 但从使用 Google 教程的代码来看 它具有固定的宽度和高度 我的 HTML 头部是这样的
  • JavaFX 在野外?

    有人知道基于 JavaFX 的真实 Web 应用程序吗 我是一名经验丰富的 Java 程序员 正在考虑在日常工作之余创建一个网站 我在 UI 方面没有太多的专业知识 因此我正在寻找最好的方法来利用我现有的技能来创建可以提供出色的 RIA 体
  • 有没有办法分析 OpenCL 或 pyOpenCL 程序?

    我正在尝试优化 pyOpenCL 程序 出于这个原因 我想知道是否有一种方法可以分析程序并查看大部分时间都花在哪里 您知道如何解决这个问题吗 提前致谢 Andi 编辑 例如 用于 CUDA 的 nvidias nvprof 可以用于 pyC
  • EntityManagerFactory + jpadaosupport 的依赖注入问题

    现在 我在将EntityFactoryManager注入到我的jpadaosupport扩展类中时遇到问题 我的配置如下
  • 使用两个 yaml 文件进行配置属性

    我们正在使用 Spring Boot 应用程序 其中的属性是从application yml文件而不是application properties 位于src main resources 如下所示 config host localhos
  • 如何在类 Unix shell 中保存交互式命令行程序的输出?

    我正在用 C 语言编码并在 Linux 终端中运行程序 我想将程序的输出保存在 txt 文件中 我通常通过执行来做到这一点 a out gt filename txt 但我编写了一个交互式程序 其中我必须输入一个数字才能启动该程序 这种情况
  • vs2013 编译用于调试但不用于发布?

    我在VS2013中遇到了一些奇怪的事情 我的程序在调试模式下构建得很好 但在release模式下 会出现很多错误 例如 Error 2 error C2440 default argument cannot convert from con
  • 这些获取 DTE2 的方法有什么区别(Visual Studio 2013)

    基于这个问题 https stackoverflow com questions 4955009 getting the dte2 or teamfoundationserverext object in a vs package proj
  • angularJS $on 事件处理程序触发顺序

    在 AngularJS 事件处理的上下文中 我想知道两件事 如何定义监听同一事件的处理程序的触发顺序 如果您开始想知道这一点 这是设计不好的迹象吗 阅读有关角度的文档后 on broadcast 和 emit http docs angul
  • 搜索不适用于 JQGrid 中的过滤器工具栏

    我在稍后阶段 而不是在退出网格时 加载 JQGrid 中的数据时遇到问题 我正在使用过滤器工具栏进行搜索 以下是我正在使用的代码 创建网格 jQuery list jqGrid datatype local colNames my col
  • 找到任意大数的算法

    这是我一直在思考的事情 假设你有一个数字 x 它可以无限大 你必须找出它是什么 您只知道另一个数字 y 是否大于或小于 x 找到 x 的最快 最好的方法是什么 一个邪恶的对手以某种方式选择了一个非常大的数字 说 int x 9 9 9 9
  • Java 是否有带有删除策略的有界集合? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 中保存最后 N 个元素的大小受限队列 https stackoverflow com questions 5498865 size limited queue that holds last
  • 斯坦福核心 NLP 如何获得概率和误差幅度

    当使用解析器或核心 NLP 中的任何注释时 有没有办法访问概率或误差幅度 为了将我的问题放在上下文中 我试图了解是否有一种方法可以以编程方式检测歧义情况 例如 在下面的句子中 动词 desire 被检测为名词 我希望能够知道我可以从 Cor
  • 需要 JavaScript 支持的页面上的 cURL 请求

    我需要获取 pinnaclesports com 的 HTML 源代码 问题是它检测cookie和JS是否启用 如果没有 它只是返回一些页面说 该网站需要启用 JavaScript 和 Cookie 请更改您的浏览器设置或升级您的浏览器 使
  • 无法在 Ubuntu 20.04 上安装 bazel - EXPKEYSIG 无效

    我正在按照以下说明进行操作https docs bazel build versions master install ubuntu html install with installer ubuntu https docs bazel b
  • 如何在快速弹出视图控制器后传递数据

    我正在制作一个关于书籍的应用程序 在应用程序中 我想让应用程序通过获取 ISBN 条形码 自动填充图书信息 views https i stack imgur com ohz2S png 有2个班 一个是 UploadMain 另一个是 S