使用Alert未记录的子视图

时间:2010-01-09 05:56:57

标签: objective-c iphone

我问了一个类似的问题here并得到了一些答案,所以首先很抱歉让人们再次烦恼。

但这次我有一个争论。首先,我将展示我的代码

- (void) showTheAlert{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Hey!" message:@"?" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Yes",@"No",@"Don't know eaxactly.",nil];
    [alertView setTag:101];
    [alertView show];
}

- (void)willPresentAlertView:(UIAlertView *)alertView{
    if(alertView.tag == 101){
        [[[alertView subviews] objectAtIndex:2] setBackgroundColor:[UIColor colorWithRed:0.5 green:0.0f blue:0.0f alpha:0.5f]];
        [[[alertView subviews] objectAtIndex:3] setBackgroundColor:[UIColor colorWithRed:0.0 green:0.5f blue:0.0f alpha:0.5f]];
    }

}

我的最终提醒看起来像是

enter image description here

现在我的困惑是,[alertView subviews]没有记录,因为有些人可能会说,但alertview是UIView的子类,它有一个名为subviews的属性。

所以我使用了一个绝对允许的超类的文档属性。

那么,如果此警报视图可能会导致我的应用被拒绝? (我认为苹果没有任何基础可以说我使用的是无证件或私人API。外观和感觉也与alertview相似。)

3 个答案:

答案 0 :(得分:6)

关于警报视图的苹果iPhone Human Interface Guidelines明确指出:

  

警报出现的频率有助于用户认真对待。一定要>尽量减少应用程序显示的警报数量,并确保每个警报提供>关键信息和有用的选择。 通常,请尽量避免创建

的警报      
      
  • 更新有关任务的用户   正常进展。   相反,请考虑使用进度   查看或活动指标   提供与进展相关的反馈   用户(描述了这些控件   在“进度观点”和“活动   指示灯”)。

  •   
  • 要求确认   用户启动的操作。要获得用户启动的操作的确认,即使是潜在的危险操作(例如删除联系人),也应使用操作表(在“使用操作表”中进行了描述)。

  •   
  • 告知用户错误或问题   他们无能为力。   虽然可能需要使用警报来告诉用户有关   这是他们无法解决的关键问题   更好地整合这些信息   如果可能,进入用户界面。   例如,而不是告诉用户   每次服务器连接失败时,   显示最后一次的时间   成功的联系。

  •   

所以,我的建议,等待潜在拒绝的时间不值得你花时间。不要冒风险。

答案 1 :(得分:4)

要关注Henrik的回复,请在iPhone人机界面指南部分"Designing an Alert"中说明以下内容:

  

虽然你可以选择数量   按钮放在警报中,a   双键警报通常是最多的   很有用,因为它最简单   用户可以选择两种   备择方案。这不是一个好主意   显示单个警报   按钮因为这样的警报不能   让用户可以控制   情况;相反,它只能   显示信息并提供   解雇按钮。 包含的警报   三个或更多按钮是显着的   比双按钮警报更复杂,   如果可能的话应该避免。   事实上,如果你发现你需要   为您提供两个以上的选择   应考虑使用行动表   相反(参见“使用动作表”和   “设计行动表”了解更多信息   有关此类观点的信息)。

     

因为用户有时会回复   警报没有仔细阅读,   一定要提供合适的   默认选择。为了帮助指导   不专心的用户对这个选择,   制作浅色,右手   按下安全,默认替代。   例如,您可以选择制作   这个按钮取消按钮,以帮助   用户避免无意中导致   危险的行为,或者你可能会成功   代表最常见的回应,如果   由此产生的行动不是   破坏性的。

     

以下指南介绍了如何操作   按钮在警报中配置:

     
      
  • 在带有两个按钮的警报中,左侧的按钮始终为   深色和按钮   右边永远不是深色的。

  •   
  • 在提示潜在风险操作的双按钮警报中,按钮   取消动作应该打开   右边和浅色。

  •   
  • 在提示良性动作的双按钮警报中,按钮即可   取消应该就行动了   左(因此是深色的)。

  •   
  • 在带有单个按钮的警报中,该按钮为浅色。
  •   

您明显违反了警报视图中按钮的大小,形状,数量和颜色的指导原则(红色具有非常明确的含义,即破坏性操作,而不是确认)。即使Apple没有拒绝您的审核申请(他们倾向于明确违反人机界面指南),这对您的用户来说也会非常混乱。

此外,导航任何Apple提供的用户界面元素的隐藏视图层次结构是一种非常糟糕的做法。视图层次结构未记录,并且经常更改。当人们升级到iPhone OS 3.0时,许多应用程序开始崩溃,因为这些应用程序通过UI元素的子视图做了一些时髦的事情,并且这些元素在新操作系统版本中发生了变化。 Apple甚至在iPhone OS 3.0迁移文档(我现在找不到)中特别指出了这一点。

由于这引起的问题,他们似乎已经严厉打击了这种做法并因此拒绝了申请。即使他们不这样做,如果你这样做也会蔑视你的用户,因为这意味着你不关心你的应用程序是否会因未来的操作系统升级而中断。

答案 2 :(得分:3)

我很确定通过挖掘视图层次来改变UIAlertView是一个禁忌。首先是因为它“以非标准方式使用标准iPhone屏幕图像,可能导致用户混淆”,其次是因为如果他们更改了视图层次结构,那么您的应用就会被破坏。

我可能错了,我从来没有尝试过这样的东西到商店,但我的直觉说不要冒险。

你可以使用标准的UIActionSheet获得一个红色按钮,不是吗?