从函数传递参数到prepareForSegue

时间:2016-07-18 18:48:18

标签: ios

我必须使用函数,它们都使用相同的segue触发performSegueWithIdentifier。但是根据调用的函数,我需要在prepareForSegue中传递不同的参数。

有点像

func first() {
  // do some stuff
  performSegueWithIdentifier("My segue", sender:AnyObject?)
}

func second() {
  // do some stuff
  performSegueWithIdentifier("My segue", sender:AnyObject?)
}

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
  if segue.identifier == "My segue" {
        let destination = segue.destinationViewController as! MyController
        if functionFirstWasCalled {
           destination.property = value
        } else if functionSecondWasCalled {
           destination.property = anotherValue
        }
    }
}

当然,我可以通过设置第二个()和第一个()的布尔值然后在prepareForSegue中检查它们来实现这一点 - 但也许有一些更优雅的方法可以做到这一点?

3 个答案:

答案 0 :(得分:0)

在目标-c中你会这样做:

     [self performSegueWithIdentifier:@"segueNAme" sender:@"firstMethod"];

您可以在prepareForSegue方法

中访问此消息
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([sender isEqualToString:@"firstMethod"]) {
        //firstMEthod called the segue
    }
}

我认为快速的等价物将是:

 self.performSegueWithIdentifier("segueNAme", sender: "firstMethod")

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject) {
    if (sender == "firstMethod") {
        //firstMEthod called the segue
    }
}

我的建议是,不是发送普通字符串,而是发送包含methodName,className和其他一些对将来调试有用的参数的字典类型对象。

答案 1 :(得分:0)

您所要做的就是通过sender属性发送一个标志,如下所示:

func first() {
    performSegueWithIdentifier("My segue", sender:true)
}

func second() {
   // do some stuff
   performSegueWithIdentifier("My segue", sender:false)
}

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

  if segue.identifier == "My segue" {
     let destination = segue.destinationViewController as! MyController
     let isFirstFunctionCalled = sender as! Bool //  cast sender to bool
     if isFirstFunctionCalled {
         destination.property = value
     } else {
         destination.property = anotherValue
     }
   }

}

答案 2 :(得分:-1)

只需在此View Controller中设置并行属性,然后根据调用的函数将其传递到目标View Controller。即:

var a = ""
var b = 0

func first() {
  // do some stuff
  a = "first function determined this variable."
  b = 1
  performSegueWithIdentifier("My segue", sender:AnyObject?)
}

func second() {
  // do some stuff
  a = "second function determined this variable."
  b = 182
  performSegueWithIdentifier("My segue", sender:AnyObject?)
}

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
  if segue.identifier == "My segue" {
        let destination = segue.destinationViewController as! MyController
        if functionFirstWasCalled {
           destination.property = a
        } else if functionSecondWasCalled {
           destination.property = b
        }
    }
}