关键词:
【中文标题】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开发的当前应用程序中将数据从一个视图传递到... 查看详情