如何将两个参数传递给下一个 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个参数传递给 Pool.starmap()?

如何将两个参数传递给百里香模板?

如何将两个参数传递给 Javascript/NodeJS 中的 API“获取”请求

Laravel 5.8:如何将两个参数传递给 Event 和 Listener

如何将两个参数传递给由 ajax 函数调用的 python 函数?

Ext Js 如何将参数传递给服务器代码