我已经在这个问题上做了一段时间,并且无法弄明白。
这是一个为页面添加书签的操作表(对于类似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个按钮/动作,剩下的就好了......
答案 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
将生成异常。