
1.9 呈现警告对话框
本节我们需要做的是在用户单击按钮以后呈现一个警告对话框,用它来显示更多的信息。仍旧在CardView的Properties部分添加一个被@State封装的私有布尔型变量。

在Body部分,当用户单击按钮后要改变showAlert的值,然后为ZStack容器新添加一个alert修饰器,代码如下。


alert修饰器带有一个参数,我们将showAlert变量传递给它。在传递的时候,showAlert前面必须加$符号作为前缀。这是为什么呢?
在一般情况下,iOS开发中参数的传递都是以值拷贝的形式进行的,也就意味着系统会将当前变量的值的副本作为参数传递给调用的方法,这样的好处在于速度快,不会造成内存调用的混乱,而且在函数内部修改参数的值,并不会影响上一级层面参数变量的值。
但是,有时候我们确实需要在调用的方法中直接修改传递进来的参数值,从而影响上一级层面做出相应的界面更新。
分析上面的代码,当用户单击按钮后,showAlert的值变为true,alert修饰器会根据showAlert的值是否为true,决定是否去打开一个警告对话框。在对话框被打开的情况下,一旦用户单击对话框中的确认按钮,Alert结构体就会将showAlert变量的值修改为false,又因为showAlert被@State封装起来,所以当showAlert值变为false的时候,CardView要再次更新用户界面,销毁警告对话框。
了解了代码的执行流程以后,你会清楚地知道其中最关键的地方,就是传递给alert修饰器的参数绝对不能为值拷贝形式,一定要传递showAlert变量的引用地址,也就意味着alert修饰器可以直接修改上一级层面的变量的值,$符号用于传递变量的引用地址。
如果你现在感觉有些晕的话也没有关系,只要照着样例代码编写就好。随着在后面几个章节中的不断运用,你就会慢慢理解其执行的原理了。
在alert修饰器的闭包中,我们通过Alert结构体直接打开一个警告对话框,它需要的参数非常直观,包括对话框的标题、信息和关闭按钮的样式。这里将对话框关闭按钮的样式设置为default,按钮标题为OK。
构建并在模拟器中运行当前的项目,单击人物卡片上的按钮以后,会看到如图1-30的效果。

图1-30 在模拟器中测试警告对话框的运行效果