2010-12-10 12 views
0

私はしばらくこのことに挑戦してきましたが、それを理解することはできません。- [UIThreePartButton text]:認識できないセレクタ

それは私がオーケーヒットすると、私は 取得(アプリのようなサファリのための)ページをブックマークアクションシートである - [UIThreePartButtonテキスト]:インスタンス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(((UITextField*)[alertView.subviews objectAtIndex:4])

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

Spefically私は4つのボタン/そのアクションシート上のアクション、そして残りの部分を持っていますいいです...

+0

例外にブレークポイントを設定してブレークポイントをオンにすると、アプリケーションを停止する行はどの行ですか? –

+0

F(alertView.tag == 1) \t \t(((UITextFieldの*)IF(buttonIndex == 1) \t \t { \t \t \tなら[alertView.subviews objectAtIndex:4])テキスト== @」 "||((UITextField *)[alertView.subviews objectAtIndex:4])。テキスト== nil) \t \t \t { – Jason

+0

私に連絡しますか? – Jason

答えて

0

アクションごとに4つのボタンがある場合、objectAtIndexは4ではなく3になりますか?あなたが限界を超えている例外を受けているようです。

具体的にはobjectAtIndex:4は、最後の有効なインデックスが3であるため、配列に4つのアイテムがある場合に例外を生成します。

+0

ええ、私は考えています...しかし、エラーは次のようになります: – Jason

+0

alertView.subviews objectAtIndex:4 私は4はバテンのインデックスについては求めていませんが、ビューのインデックスを知っていると思います。私はどういうわけか私の意見を離れているかもしれません – Jason

+0

間違ったインデックスのacutalビューではなく、ボタン。 – Jason

2

Appleが他の点で文書化していないUI要素のビュー階層を手動でトラバースしないでください。 [alertView.subviews objectAtIndex:4]のようなことは危険です。なぜなら、UIAlertViewの内部構造を盲目的に仮定しなければならなくなるからです。

この場合、間違った要素(UIThreePartButton)に当たって例外が発生してアプリケーションがクラッシュします。あなたのテキストフィールドが現在どこにあるのか正しいインデックスを取得したとしても、Appleが将来のOSリリースでビュー番号や注文を変更して、アプリケーションのすべてのインストールが突然クラッシュするという保証はありません。

これを防ぐには、UITextFieldへの参照を保持して、UIAlertViewのビュー階層を調べる必要はありません。

さらに、テキスト入力にはアラートビューを使用せず、カスタムモーダルビューを使用してください。アラートは、頻繁に発生するエラー表示やその他の重要な更新のために予約する必要があります。 iOS Human Interface Guidelinesから:

に警告を発しているとまれでは、ユーザーが 真剣にそれらを取ることができます表示されます。アプリに表示される アラートの数を最小にし、 はそれぞれが重要な情報と有用な選択肢を提供するようにしてください。 FYI、あなたはまた、上記のコードでは、あなたのsiteNameのUITextFieldをリークしている、そして潜在的にあなたのUIAlertViewとして

関連する問題