swift - 通过 prepareforsegue 在 2 个视图控制器之间添加值

     2023-02-23     216

关键词:

【中文标题】swift - 通过 prepareforsegue 在 2 个视图控制器之间添加值【英文标题】:swift - adding values between 2 view controllers by prepareforsegue 【发布时间】:2015-02-17 08:36:33 【问题描述】:

我有 2 个 ViewController:ViewController1、ViewController2。 ViewController1 中的“添加”按钮将调出 ViewController2。然后,用户将在 ViewController2 中输入值,然后由 prepareforsegue 将其传递回 ViewController1。然后将这些值附加到 viewcontroller1 中类型数组的属性上。

这是重复的,用户继续按下添加按钮以从 ViewController1 中调出 ViewController2,然后通过 prepareforsegue 添加要附加到 ViewController1 中数组类型属性的新值。

但是,在从 ViewController2 附加第一组值之后,情况就不是这样了。第二组值将覆盖第一组值。

示例。

第一次通过后-> force =[1],stiffness[1]

第二次通过后->force=[2],stiffness[2]

我想要这个 -> 力 = [1,2], 刚度 [1,2]

我想继续添加直到 -> force = [1,2,3,4,5],stiffness[1,2,3,4,5]

ViewController1

class ViewController1: UITableViewController, UITableViewDataSource 
    var force = [Float]()
    var stiffness = [Float] ()
@IBAction func Add(sender: AnyObject)  


ViewController2

class ViewController2: UIViewController 
        var forceVar : Float = 0.0
        var stiffVar : Float = 0.0

@IBAction func submit(sender: AnyObject) 
        self.performSegueWithIdentifier("springSubmit", sender: sender)
        

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) 
        if(segue.identifier == "springSubmit") 
            var svcSubmitVariables = segue.destinationViewController as ViewController1

            svcSubmitVariables.force.append(forceVar)
            svcSubmitVariables.stiffness.append(stiffVar)   
        

【问题讨论】:

【参考方案1】:

performSegueWithIdentifier 方法将始终初始化新的视图控制器,因此在您的示例视图控制器中,显示 ViewController2 与提交数据后初始化的对象不同,并且这个新初始化的对象将只有初始化值。要实现您要查找的内容,您需要在 ViewController1 上声明一个函数,该函数会将数据附加到您的数组中,将该函数传递给 ViewController2 并在提交方法中调用它,这样您的视图控制器将如下所示:

ViewController1

class ViewController1: UITableViewController, UITableViewDataSource 

    var force = [Float]()
    var stiffness = [Float] ()

    override func viewWillAppear(animated: Bool) 

     //check if values are updated
     println(force)
     println(stiffness)
    

    @IBAction func Add(sender: AnyObject)  
        self.performSegueWithIdentifier("viewController2", sender: sender)
    

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) 
        if(segue.identifier == "viewController2") 

            var addVariables = segue.destinationViewController as ViewController2
            addVariables.submitFunc = appendData
                  
    

    func appendData(newForce:Float,newStiffness:Force)
        force.append(newForce)
        stiffness.append(newStiffness)
           

ViewController2

class ViewController2: UIViewController 
    var forceVar : Float = 0.0
    var stiffVar : Float = 0.0
    var submitFunc:((newForce:Float,newStiff:Float)->())!

    @IBAction func submit(sender: AnyObject) 

        submitFunc(forceVar,stiffVar)
        self.dismissViewControllerAnimated(false, completion: nil)

    

【讨论】:

提交方法不太明白?这个提交方法是做什么用的?是否应该准备好将值传回 ViewController1? @Cherry_thia 您不必在 ViewController2 上使用 perfromSegue 方法,因为 ViewController1 已经存在,而是在 ViewController1 上使用 performSegue 和 preapreForSegue 来显示 ViewController2 这仍然不起作用。每当 Viewcontroller2 进入 Viewcontroller1 时,Viewcontroller1 中的变量仍会初始化为零。 ViewController2 不应该转到 ViewController1,而是 ViewController2 必须只关闭自己才能使 ViewController1 再次出现。您可以发布所有代码吗? 您的代码是正确的,可能有问题的是访问新值的时刻:如果您在 viewDidLoad 方法中访问这些值,那么它是错误的,您应该按照已编辑答案中的描述在 viewWillAppear 上执行此操作跨度> 【参考方案2】:

视图控制器

    import UIKit

class ViewController: UITableViewController, UITableViewDataSource 

    var springNumber:NSInteger = 0
    var force = [Float]()
    var stiffness = [Float] ()

    // MARK: UITableViewDataSource
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    override func tableView(tableView: UITableView,
        numberOfRowsInSection section: Int) -> Int 
            return springNumber
    

    override func tableView(tableView: UITableView,
        cellForRowAtIndexPath
        indexPath: NSIndexPath) -> UITableViewCell 

            let cell = tableView.dequeueReusableCellWithIdentifier("Cell")
                as UITableViewCell

            cell.textLabel!.text = "Spring \(indexPath.row)"

            return cell
    

    func fwall() -> Float 
        for rows in 0..<(springNumber+1)  
            force[0] = force[0] + force[rows]
        
        force[0] = -(force[0])
        return force[0]
    

    override func viewWillAppear(animated: Bool) 

        super.viewWillAppear(animated)

        title = "Springs' Variables"
            tableView.registerClass(UITableViewCell.self,
                forCellReuseIdentifier: "Cell")

        if(springNumber==0) 
            force.append(0.0) 

        println(force)
        println(stiffness)
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    //Adding Values
    @IBAction func Add(sender: AnyObject) 
        self.performSegueWithIdentifier("addSpring", sender: sender)
    

    @IBAction func solve_Pressed(sender: AnyObject) 
        self.fwall()
        self.performSegueWithIdentifier("Solve", sender: sender)
    

    func appendData (newForce: Float, newStiffness:Float, newSpring: NSInteger) 
        force.append(newForce)
        stiffness.append(newStiffness)
        springNumber = newSpring
        println(springNumber)
        println(force)
        println(stiffness)
    

    override func prepareForSegue ( segue: UIStoryboardSegue, sender: AnyObject!) 

        if (segue.identifier == "addSpring") 
            var addVariables = segue.destinationViewController as SpringTableViewControllerInsertVariables
                addVariables.submitFunc = appendData
        

        if (segue.identifier == "Solve") 
            var svcViewController2 = segue.destinationViewController as ViewController2
            svcViewController2.forceView2 = self.force
            svcViewController2.stiffView2 = self.stiffness
            svcViewController2.springNumView2 = self.springNumber
        

        if (segue.identifier == "showDetail") 

        
    

springTableViewControllerInsertVariables 的代码

import UIKit

类 SpringTableViewControllerInsertVariables: UIViewController

var forceVar : Float = 0.0
var stiffVar : Float = 0.0
var springNum : NSInteger = 0

var submitFunc: ((newForce:Float,newStiff:Float,newSpring:NSInteger)->())!

@IBOutlet weak var image: UIImageView!

var imageArray :[UIImage] = [UIImage(named: "springAtWall.jpg")!, UIImage(named:"spring.jpg")!]

override func viewDidLoad() 
    if(springNum == 0) image.image = imageArray[0] 
    else image.image = imageArray[1] 


@IBOutlet weak var force: UILabel!
@IBOutlet weak var forceEntered: UITextField!

@IBOutlet weak var stiffness: UILabel!
@IBOutlet weak var stiffnessEntered: UITextField!

@IBAction func checkboxed(sender: AnyObject) 
    //when checkedboxed is checked here. 
    //1)UIImage is changed
    //2)calculate2 function is used for calculate1


@IBAction func submit(sender: AnyObject) 
    //might not work because springNum will be initialise to zero when this viewcontroller starts...

    forceVar = (forceEntered.text as NSString).floatValue
    stiffVar = (stiffnessEntered.text as NSString).floatValue

    springNum = springNum + 1

    submitFunc(newForce: forceVar ,newStiff: stiffVar, newSpring: springNum)

    self.dismissViewControllerAnimated(false, completion: nil)


【讨论】:

Swift:如何在 UICollectionViewCell 中使用“prepareForSegue”?

】Swift:如何在UICollectionViewCell中使用“prepareForSegue”?【英文标题】:Swift:Howtouse"prepareForSegue"insideUICollectionViewCell?【发布时间】:2016-08-1808:02:39【问题描述】:我在UITableView中有一个UICollectionView,当用户点击UICollectionVie... 查看详情

prepareForSegue 不适用于自定义 segue (swift)

】prepareForSegue不适用于自定义segue(swift)【英文标题】:prepareForSeguewon\'tworkwithcustomsegue(swift)【发布时间】:2015-04-2914:23:33【问题描述】:我创建了一个自定义segue,但它一直给出同样的错误。即使我创建了一个真正简单的UIStoryboar... 查看详情

Swift:prepareForSegue 有两个不同的 segue

】Swift:prepareForSegue有两个不同的segue【英文标题】:Swift:prepareForSeguewithtwodifferentsegues【发布时间】:2015-07-1614:37:11【问题描述】:我有2个UIButtons在视图中。它们中的每一个都链接到2个不同的视图。他们必须根据您刚刚点击的... 查看详情

在 Swift 2 中通过“prepareForSegue”传递数据

】在Swift2中通过“prepareForSegue”传递数据【英文标题】:Passdatavia\'prepareForSegue\'inSwift2【发布时间】:2016-03-0409:20:37【问题描述】:试图将字符串从一个视图控制器传递到另一个视图控制器(MoreDetailViewController)出现这个错误:I... 查看详情

Swift:prepareForSegue 和 instantiateViewController 之间的区别

】Swift:prepareForSegue和instantiateViewController之间的区别【英文标题】:Swift:DifferencebetweenprepareForSegueandinstantiateViewController【发布时间】:2015-05-1112:02:04【问题描述】:我正在尝试为我的项目中的导航获取更多通用解决方案,并且我... 查看详情

(Swift) PrepareForSegue: 致命错误: 在展开可选值时意外发现 nil

】(Swift)PrepareForSegue:致命错误:在展开可选值时意外发现nil【英文标题】:(Swift)PrepareForSegue:fatalerror:unexpectedlyfoundnilwhileunwrappinganOptionalvalue【发布时间】:2014-08-2109:16:23【问题描述】:DetailViewController:@IBOutletvarselectedBundesland:UI 查看详情

Swift:PrepareForSegue 正在运行但未加载 ViewController

】Swift:PrepareForSegue正在运行但未加载ViewController【英文标题】:Swift:PrepareForSeguerunningbutnotloadingViewController【发布时间】:2016-02-1011:29:42【问题描述】:我仍在尝试在iOS中链接UIViewControllers等。我在segues方面遇到了很多荒谬的问... 查看详情

Swift PrepareForSegue EXC_BREAKPOINT

】SwiftPrepareForSegueEXC_BREAKPOINT【英文标题】:【发布时间】:2015-02-1206:46:58【问题描述】:我有一个运行时错误:线程1:EXC_BreakPoint(cod=EXC_I1386_BPT,subcode=0x0)我没有在Xcode中设置任何断点。从调试器来看,错误是由于PrepareForSegue停... 查看详情

在 Swift 3 中使用 prepareForSegue 分配对象变为 nil

】在Swift3中使用prepareForSegue分配对象变为nil【英文标题】:assingobjectwithprepareForSeguebecomesnilinSwift3【发布时间】:2017-09-2202:00:26【问题描述】:先生,我正在尝试实现一个表单并传递下面的数据对象importUIKitimportGRDBclassStaff:Recordvar... 查看详情

如何在swift中的prepareforsegue中使用标签而不是按钮

】如何在swift中的prepareforsegue中使用标签而不是按钮【英文标题】:howtouselabelinsteadofbuttoninprepareforsegueinswift【发布时间】:2015-11-2313:29:02【问题描述】:在我的应用程序中,您在textField中输入integer在viewcontroller1中。如果integer大... 查看详情

如何在 uitableviewcell swift 中使用多个 prepareforsegue 传递数据

】如何在uitableviewcellswift中使用多个prepareforsegue传递数据【英文标题】:Howpassingdatawithmultipleprepareforsegueinauitableviewcellswift【发布时间】:2015-10-1508:31:01【问题描述】:我有一个UItableViewCell并根据单元格中的文本,我想转到另一个... 查看详情

Swift:使用 prepareForSegue 将 UIView 容器的高度设置为嵌入式 UITableView 的高度

】Swift:使用prepareForSegue将UIView容器的高度设置为嵌入式UITableView的高度【英文标题】:Swift:SettingheightofUIViewcontainertotheheightofembeddedUITableViewusingprepareForSegue【发布时间】:2016-01-0204:38:00【问题描述】:我在UIView容器中嵌入了一个U... 查看详情

Swift - PrepareForSegue 无法传递 sender.tag(其他 ViewController 标签中的值为零)

】Swift-PrepareForSegue无法传递sender.tag(其他ViewController标签中的值为零)【英文标题】:Swift-PrepareForSeguefailstopasssender.tag(nilvalueinotherViewControllerLabel)【发布时间】:2015-02-1509:15:36【问题描述】:我尝试以编程方式创建大量按钮,然... 查看详情

将视图控制器分配给 prepareForSegue 中的变量时的 Swift EXC_BREAKPOINT

】将视图控制器分配给prepareForSegue中的变量时的SwiftEXC_BREAKPOINT【英文标题】:SwiftEXC_BREAKPOINTwhenassigningviewcontrollertovariableinprepareForSegue【发布时间】:2014-07-0312:58:25【问题描述】:尝试使用我的destinationViewController执行变量分配时... 查看详情

如何通过prepareForSegue:一个对象

】如何通过prepareForSegue:一个对象【英文标题】:HowtopassprepareForSegue:anobject【发布时间】:2011-10-2304:34:43【问题描述】:我在地图视图中有很多注释(带有rightCalloutAccessory按钮)。该按钮将执行从mapview到tableview的转换。我想将ta... 查看详情

为啥我的 prepareForSegue 崩溃

】为啥我的prepareForSegue崩溃【英文标题】:whydoesmyprepareForSegueCrash为什么我的prepareForSegue崩溃【发布时间】:2015-05-0413:31:34【问题描述】:我试图通过导航控制器通过segue传递IndexPath,但它在线崩溃:view.selectedAccount=self.selectedAcco... 查看详情

swift prepareForSegue 不工作 / exc_breakpoint (code=exc_i386_bpt subcode=0x0)

】swiftprepareForSegue不工作/exc_breakpoint(code=exc_i386_bptsubcode=0x0)【英文标题】:swiftprepareForSeguenotworking/exc_breakpoint(code=exc_i386_bptsubcode=0x0)【发布时间】:2014-12-2303:22:46【问题描述】:我有这个根本没有被调用的函数。我没有准备好继... 查看详情

prepareForSegue 清空我的 NSManagedObject 数组

】prepareForSegue清空我的NSManagedObject数组【英文标题】:prepareForSegueemptiesmyNSManagedObjectArray【发布时间】:2016-05-2602:08:37【问题描述】:我需要在我正在使用适用于iOS8的最新版本Swift开发的当前应用程序中将数据从一个视图传递到... 查看详情