如何将两个参数传递给下一个 ViewController?
Posted
技术标签:
【中文标题】如何将两个参数传递给下一个 ViewController?【英文标题】:How to pass two parameters to the next ViewController? 【发布时间】:2014-10-28 09:44:26 【问题描述】:这是我的情况。我正在使用 NSTimer,它计数 15 秒,但我也有按钮,我用它来更早地停止这个计时器。更重要的是,这个按钮将我带到下一个 tableViewController。第二个参数是日期——欧洲中部的当前时间。如果我单击一个按钮,我需要移动到下一个 TableViewController,并将这两个参数放入 TableViewController。这是我的代码:
**FirstViewController:**
import UIKit
class FirstViewController: UIViewController
var timer = NSTimer()
@IBOutlet weak var labelCounter: UILabel!
override func viewDidLoad()
super.viewDidLoad()
timer = NSTimer.scheduledTimerWithTimeInterval(1,target:self, selector: Selector("update"),userInfo: nil, repeats :true)
func update()
timer.invalidate()
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)
if (segue.identifier == "segueTest")
var transfer = segue!.destinationViewController as SecondViewController
transfer.toPass = labelCounter.text
transfer.toPass2 = "\(NSDate())"
@IBAction func buttonPressed(button: UIButton)
if labelCounter.text > "0"
timer.invalidate()
SecondViewController:
import UIKit
class ThirdViewController: UIViewController
@IBOutlet weak var label1: UILabel!
@IBOutlet weak var label2: UILabel!
var toPass: String!
var toPass2: String!
override func viewDidLoad()
super.viewDidLoad()
label1.text = toPass2
label2.text = toPass
// Do any additional setup after loading the view.
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
这段代码运行良好 :) 在情节提要中,我必须将 firstViewController 与 SecondViewController 连接起来。我通过将我的按钮与 secondViewController 连接并将 segue 标识符设置为“segueTest”来做到这一点
【问题讨论】:
Passing Data between View Controllers 的可能重复项 您可以使用self.performSegueWithIdentifier("mySegue",sender:self)
从buttonPressed
调用segue。其余部分在此处进行解释-可能与Pass variables from one ViewController to another in Swift 重复
我解决了这个问题,我在上面编辑了我的代码。
【参考方案1】:
我不知道它对你有用与否
BViewControl.h
@interface Showdeals : UIViewController
NSString *TotalJSonString;
NSString *PassingString;
NSMutablearray *setarray;
@property (strong,nonatomic)NSString *TotalJSonString;
@property (strong,nonatomic)NSString *PassingString;
BViewControl.m
- (void)viewDidLoad
[setarray addObject:TotalJSonString];
[setarray addObject:PassingString];
最后你将 setarray 传递给 UITableView
AViewControl.m 在按钮动作中
BViewControl *show=[[BViewControl alloc]initWithNibName:nil bundle:nil];
[show setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
show.TotalJSonString=string1;
show.PassingString=string2;
[self.navigationController popToRootViewControllerAnimated:TRUE];
[self presentViewController:show animated:YES completion:NULL ];
【讨论】:
【参考方案2】:覆盖 prepareForSegue
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!)
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
//CHECK SEGUE IDENTIFIER HERE IF YOU HAVE MULTIPLE SEGUES
(segue.destinationViewController as MyViewController).property = value // you can repeat this for any number of properties in your destination view controller
【讨论】:
我正在考虑这种传递数据的方法,所以如果我这样做,我如何在界面构建器中连接两个视图? 您在什么操作上显示视图控制器?如果它是在单击按钮或选择 tableview 时,则将该 UI 元素的 segue 连接到视图控制器。 raywenderlich.com/5191/beginning-storyboards-in-ios-5-part-2【参考方案3】:在 secondview 控制器中创建一个属性。并使用类对象将当前视图控制器的值分配给 secondview 控制器属性。
【讨论】:
【参考方案4】:您确实应该使用 prepareForSegue。代码如下:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.destinationViewController respondsToSelector:@selector(setMyData:)])
[segue.destinationViewController performSelector:@selector(setMyData:)
withObject:myData];
在目标 ViewController 中,你应该有
@property (nonatomic, strong) MyData *myData;
如果你想传递多个值,你可以用这两个值创建一个对象,然后将一个对象作为数据传递。
或者,您可以创建一个数组,用于放置数据或字典,并将其作为数据传递。
所以,MyData 可以是 NSString、NSArray、NSDictionary 或任何你需要的 :)
编辑:
您还可以做另一件事,它根本不包括 segue。 您可以创建仅在您的应用生命周期中存在的静态变量。
我在所有应用程序中总是做的是一个常量类。
这里有一些代码:
常量.h
@interface Constants : NSObject
+ (Constants*)shared;
@property NSString* constantA;
@property int constantB;
@property NsMutableArray array;
@end
常量.m
@implementation Constants
static Constants *constants = nil;
+ (Constants*)shared
if (nil == constants)
if (constants == nil)
constants = [[[self class]alloc] init];
// Remember to initialize an array (this is just an example, if you need an array. if you need only one int and string for example, skip this)
[Constants shared].array = [[NSMutableArray alloc]init];
return constants;
现在,假设您有 2 个 ViewController,并且您想从第一个中读取一些变量,然后转到另一个。
在第一个 ViewController 中,只需这样做:
[Constants shared].constantA = yourValue1;
[Constants shared].constantB = yourValue2;
然后,当您到达第二个 ViewController 时,从 Constants 类中读取您的值,如下所示:
int firstVal = [Constants shared].constantA;
NSString* secondVal = [Constants shared].constantB;
记住在两个 ViewController 中都使用 #import "Constants.h"。
这在 Swift 中也很容易做到。我还不知道它的语义,但我相信你能弄清楚:)
编辑 2
如果变量之一必须是时间,并且它取决于用户按下按钮的时间,您可以执行以下操作(在此示例中,您将需要用户按下此格式的按钮的时间: @"yyyy-MM-dd HH:mm:ss"
-(IBAction) onButtonClick
NSDateFormatter *DateFormatter=[[NSDateFormatter alloc] init];
[DateFormatter setDateFormat:@"yyyy-MM-dd%20HH:mm:ss"];
NSString dateTime = [DateFormatter stringFromDate:[NSDate date]];
[Constants shared].time = dateTime;
// and after you do it, you can segue to another ViewController, like you do
let view = self.storyboard?.instantiateViewControllerWithIdentifier("segue") as TableViewController
self.navigationController?.pushViewController(view, animated: true)
【讨论】:
你能用 Swift 写这段代码吗? ;d 对于 NSArray 中的“a”和“b”两个对象? 不幸的是,我还不知道 swift :( 我对我的答案进行了编辑。有一种方法可以使用静态变量在两个(或更多)ViewController 之间传输数据 如果我的 constantA 必须是变量值怎么办?这是时间,这取决于用户。以上是关于如何将两个参数传递给下一个 ViewController?的主要内容,如果未能解决你的问题,请参考以下文章
如何将两个参数传递给 Javascript/NodeJS 中的 API“获取”请求
Laravel 5.8:如何将两个参数传递给 Event 和 Listener