我遇到的问题是要了解调用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?
..
..
..
}
答案 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
设置它的视图,并在初始化器中处理所有这些事情。 (但要小心,你必须遵守系统规则来加载视图,卸载视图或......,因为这些任务是高度处理和消耗内存的,所以这就是为什么它们以这种方式定义)