可以通过UIActionSheet和UIAlertView对象与用户对话。它们通过弹出或在其他视图上方滚动来发送消息。这些轻量级类向应用程序中添加双向对话。警告直观地与用户"对话"并且可以提示用户回答。应用程序在屏幕上显示警告,获取用户确认,然后关闭警告继续进行其他任务。
如果你认为警告只不过是附带OK按钮的消息(如图4-1所示),那么这样的结论值得反思。UIAlertSheet对象提供了丰富的功能(假设苹果公司继续让你访问这些丰富的功能)。借助警告表,你可以实际构建菜单、文本输入、查询以及更多内容。遗憾的是,此行为多半都被归类为文档中未记录或几乎未记录的类别。在本章的秘诀中,你将了解如何创建可以在自己程序中使用的各种实用的警告。
本章中涉及的大部分功能已从正式的SDK中删除,但在公共框架中仍然存在。由于本章更多地依赖于"非正式"调用,因此应该找到可靠性和功能之间的最佳平衡点。苹果公司不鼓励开发人员使用私有例程,因为开发人员会随意更改这些例程。但其本质与Mac OS X相同。如果你知道如何在公共架构中使用私有例程的方法,则可以使用它们。在应用程序中访问私有框架则是错误的做法。
说明 在早期版本的iPhone固件中,UIActionSheet和UIAlertView实际上由相同的UIAlertSheet类实现。该类不仅提供弹出警告,而且还提供菜单功能。然后苹果公司将警告表替换为UIModalView,并对来自该基类的这些新对象进行子类化。之后,苹果公司删除了UIModalView,在新版本的SDK中,UIActionSheet和UIAlertView不再由此类派生。(它们都来自于UIView。)与其前身一样,它们在行为方面仍然属于同类,并且使用相似的底层技术在屏幕上呈现自己。
记录结果
由于printf非常简单,因此大部分秘诀都使用printf以可以查看的格式输出它们的结果。在最初的SDK Beta版本期间,printf提供了检查内部程序数据的最可靠的方法。现在,在最新的iPhone SDK版本中,NSLog()得到了完全实现,并且非常稳定。此外,下面给出了几个实用的技巧。
重定向stderr
标准的freopen()函数将stderr输出重定向到你选择的日志文件,为其指定一个本地路径。此处,logPath是一个标准的NSString(如@"/tmp/mylog"),它已被转换为本地文件系统表示。完成此调用之后,所有stderr结果(包括NSLog)将直接进入你的日志文件。当你的程序运行时,使用"w"(写)而不是使用"a"(附加)来重新启动日志:
构建自定义日志函数
构建你自己的日志函数,可以添加除标准NSLog之外的功能。下面是模拟NSLog功能的一个基本日志函数。通过此函数,可以方便地生成警告通知或文本视图更新,而不必输出到stderr:
构建警告
若要创建警告表,请分配一个UIAlertView对象。通过初始化为其分配一个标题、一个按钮数组和若干其他选项。该标题是一个NSString,按钮数组包含多个NSString,其中每个字符串表示一个按钮。代码清单4-1创建了一个非常简单的警告,如图4-1所示。
使用警告时,通常空间非常珍贵。将所有按钮放在一行上可以最大程度地减小警告高度,并且这也是默认表示。当定义更多按钮时,它们会一个挨一个地添加到该行中。因此,任何时候都要将添加的按钮数量限制为不超过3个或4个。按钮越少,效果越好,最好只有一两个。
UIAlertView对象没有提供可视的"默认"按钮突出显示。在iPhone上下文中,按钮突出显示不但不能提供帮助,而且还容易造成混淆。(例如,用户应该按浅色按钮还是深色按钮?)没有办法使界面符合用户期望,因为此表示不明确。因此,与OS X不同的是,苹果公司在较新的iPhone固件中删除了突出显示。
说明 Cancel按钮出现在菜单的底部,并且位于弹出警告的左侧。