- [UIThreePartButton text]:无法识别的选择器

时间:2010-12-10 15:12:10

标签: iphone

我已经在这个问题上做了一段时间,并且无法弄明白。

这是一个为页面添加书签的操作表(对于类似app的游戏)当我点击Okay时,我得到了 - [UIThreePartButton text]:实例XXXX中无法识别的选择器

我似乎无法跨过痛苦的地方。

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 0) 
    {
        UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Bookmarks" message:@"Please enter the site name: \n \n \n" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
        alert.center=CGPointMake(160, 50);
        alert.tag=1;

        UITextField *siteName=[[UITextField alloc]initWithFrame:CGRectMake(20, 70, 245, 30)];
        siteName.backgroundColor=[UIColor clearColor];
        siteName.borderStyle=UITextBorderStyleRoundedRect;
        siteName.autocorrectionType=UITextAutocorrectionTypeNo;
        siteName.delegate=self;
        siteName.clearButtonMode=UITextFieldViewModeWhileEditing;
        siteName.text=[[mainDelegate.sitesArray objectAtIndex:tag] objectForKey:@"webSite"];
        siteName.returnKeyType=UIReturnKeyDone;
        siteName.tag=2;
        [alert addSubview:siteName];

        [alert show];
    } 
}

我意识到它在它下面的警报视图方法中死了:

if(alertView.tag==1)
    if (buttonIndex==1)
    {
        if(((UITextField*)[alertView.subviews objectAtIndex:4]).text==@""||((UITextField*)[alertView.subviews objectAtIndex:4]).text==nil)
        {

if(((UITextField*)[alertView.subviews objectAtIndex:4])

上喋喋不休

我在该操作表上有4个按钮/动作,剩下的就好了......

2 个答案:

答案 0 :(得分:2)

请勿尝试手动遍历Apple未以其他方式记录的UI元素的视图层次结构。像[alertView.subviews objectAtIndex:4]这样的事情是危险的,因为你最终必须盲目地假设UIAlertView的内部结构。

在这种情况下,您遇到了错误的元素(UIThreePartButton)并使应用程序崩溃并出现异常。即使你确实在你的文本字段所在的位置得到正确的索引,也无法保证Apple不会在未来的操作系统版本中更改视图编号或订购,突然导致应用程序的所有安装都崩溃。

要防止这种情况,请继续引用您的UITextField,这样您就不需要在UIAlertView上探测视图层次结构。

更好的是,不要使用警报视图进行文本输入,而是使用自定义模式视图。警报确实应该保留用于不频繁的错误显示或其他关键更新。来自iOS Human Interface Guidelines

  

警报的频率   出现帮助用户接受它们   认真。一定要尽量减少   您的应用显示的提醒数量   确保每个人都提供关键   信息和有用的选择。

作为一个FYI,您还在上面的代码中泄漏了siteName UITextField,可能还有您的UIAlertView。

答案 1 :(得分:0)

如果每个动作有4个按钮,你的objectAtIndex不是3而不是4?好像你得到了一个超出范围的例外。

如果自上一个有效索引为objectAtIndex:4以来数组中有4个项,则3将生成异常。