准备的LifeCycle(forSegue:....)

时间:2017-08-07 11:19:08

标签: ios swift

我遇到的问题是要了解调用prepare(forSegue:)方法时发生的情况。我将数据的机制从MainVeiwController传递到SecondViewController。特别是在传递值时,我无法从SecondViewController初始化MainViewController的@IBOUTLET,但我可以初始化其他可选属性,例如var name:String? SecondViewController。对它有点好奇。

进一步阐述问题:

  

主视图类:

class MainViewController:UIViewController{
  ..
  ..
  ..
  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let yourVC = segue.destinationViewController as? SecondViewController {
        // this doesn't throw any error
        yourVC.someData = self.someData

        // this throws an error 
        yourVC.textLabel.text = self.someData

      } 
   }
}
  

第二视图的类:

class SecondViewController:UIViewController{

@IBOULET weak var textLabel:UILabel!
var someData:String?
..
..
..
}

2 个答案:

答案 0 :(得分:0)

viewDidLoad中的

SecondViewController始终在 prepare(forSegue:)之后被称为,因此在prepare(forSegue:) IBOutlet SecondViewController gen_sh1="api_format=$api_format&api_key=$api_key&api_nonce=$api_nonce&api_timestamp=$api_timestamp&custom.videoId="$customvideoId"&description=$description&downloadurl=$sourceurl&duration=$duration&sourceformat=$sourceformat&sourcetype=$sourcetype&sourceurl=$sourceurl&title="$description"GKxS7otlAsujiRxXHTvshUE9" 内尚未连接,无法访问。

答案 1 :(得分:0)

创建UIViewController实例时,它不包含任何视图(除非您自己在初始化程序中添加它们 - 请不要这样做。)

当第一次呈现viewController时,它会检查view是否为nil,如果它是nil,它将从nib或storyboard加载自身视图注入viewController并为你调用viewDidLoad(_:),因此在prepare(forSegue:)系统中只为你实例化一个viewController(基于segue目的地类型),你必须配置它{{1} },不是它的观点。如果你想控制视图,你可以调用data来强制viewController加载它的视图(这是一个反模式,如果它是你唯一的选择就使用它。)

通常这就是它的完成方式:

您可以定义一些可从外部设置的变量。例如:loadViewIfNeeded()告诉编译器忽略该值是否为nil(如果你愿意,可以设置一些默认值)。在您的var someString: String!方法中,将它们分配给您知道的相关视图。

我们知道,这有点打破viewDidLoad(),但这是你使用故事板时唯一的选择,因为系统负责实例化和加载/卸载views / viewControllers。如果要干净地编码,可以定义一个viewController并按OOD设置它的视图,并在初始化器中处理所有这些事情。 (但要小心,你必须遵守系统规则来加载视图,卸载视图或......,因为这些任务是高度处理和消耗内存的,所以这就是为什么它们以这种方式定义)