An iOS7 and iOS8 simple alert

本文提供了一个适用于iOS7和iOS8系统的警告提示类,使用了UIAlertController来实现统一的代码逻辑,确保了代码在不同版本间的兼容性。通过引入自定义的SevenEightAlert类,简化了在不同iOS版本中显示警告提示的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://coding.tabasoft.it/ios/an-ios7-and-ios8-simple-alert/

In iOS8 the code to show a simple alert to the user is completely changed. UIAlertView is now deprecated:

alert deprecated

The new class is UIAlertController and it is not complex to use (more in a minute). But we also want to support our iOS7 users, so wouldn’t it be nice to have a single class handling the different code? This is what we are going to create in this post.

The old way

To show a simple alert with an “OK” button in iOS7 we use this code:

Then we conform our class to the UIAlertViewDelegate protocol and add the method:

This method is called when the button “ok” is pressed. Very simple code and the result is:

ios7alert

This code works right in iOS7 and iOS8 (but it is deprecated in iOS8).

The new way

The new way to do this is in iOS8 is to allocate an UIAlertController, add to it an action relative to the button “OK” and then present the controller using presentViewController.

The result is identical to the previous:

ios8alert

Two notes about the iOS8 code:

  • If you run it in iOS7 you cause a crash, so this can be used only if your running device has a system >= iOS8
  • A curiosity: in iOS7 you could show an alert from inside viewDidLoad. Now, if you try this, you get a message in the console “Warning: Attempt to present <UIAlertController: 0x7fb219733510> on <ViewController: 0x7fb2196625d0> whose view is not in the window hierarchy!” and nothing happens. It seems that the alert is now a controller and the controller hierarchy is not yet ready. I think this is not a problem and you should not show an alert from viewDidLoad anyway. I showed the alert from the viewDidAppear method.

A single multi-system Alert object

Now we want to create our class that hides the different implementation from our app.

Let’s call it SevenEightAlert. We will invoke it with the common code:

The implementation

In our class we ask for the current version of the system using UIDevice.currentDevice().systemVersion and execute different code depending on it:

Note that for iOS7 we save the closure passed as the third parameter in a property in order to use it later, in the alertView method of the UIAlertViewDelegate.

This code works perfectly on iOS8: we see the alert, press OK and see the log in the console (“alert dismissed”) and the alert disappear graciously.

But when we run it on iOS7 the app just … crashes (with a bad SIGABRT signal). Why?

Alert is Asynchronous

In viewDidAppear we create an instance of SevenEightAlert (calling SevenEightAlert()), then we call show on it and exit from the function. At the time the closure is called (when we press back, some seconds after) that instance does not exist anymore. But that instance was also the delegate of our UIAlertView (remember “delegate = self”) so the app crashes trying to call a delegate object that does not exist anymore.

Not a simple problem, we should try to extend the life of that instance more after the method viewDidAppearreturns. How we can do this?

Welcome the associated object

In iOS we can associate an object to another object.

This is a feature of the Objective-C 2.0 runtime, useful when we want to add a property to another object (of which we don’t have the code), something we cannot do with a category (or swift extension).

To read more about associated object start from this apple document.

If we use associated objects we also extend the length of the life of the object we attach to the length of the life of the object attached (as if it would be a property).

To use associated object we must extend NSObject (because it uses theObjective-C 2.0 runtime).

In the SevenEightAlert.show method, if the system is <= 7 and the action is not nil, we associate ourself to the calling view controller using the objc runtime function objc_setAssociatedObject:

Having declared the two properties:

(assocObjectHandle is simply a key we use as a reference of the association)

We then remove the association after the closure execution in the delegate’s alertView using objc_setAssociatedObject:

And now the code works right also for iOS7 and the callback action is called when the user press “OK”.

ios7-8alert

You can find the complete code of the class in the GitHub project SevenEightAlert.

And, as usual, if you have comments please feel free to contribute.


内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值