【问题标题】:How to pass two parameters to the next ViewController?如何将两个参数传递给下一个 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”来做到这一点

【问题讨论】:

标签: ios iphone uitableview 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 必须是变量值怎么办?这是时间,这取决于用户。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      相关资源
      最近更新 更多