FacebookPostViewControllerという名前のUIViewControllerのサブクラスでUITextViewを使用します。したがって、テキスト ビューの目的は、ユーザーが準備された投稿の内容を確認し、場合によっては変更を加え、テキスト ビューのテキストを Facebook に投稿するかどうかを決定できるようにすることです。
UITextView のreturnKeyTypeプロパティをUIReturnKeySendに設定しました。実際に Facebook に投稿するために使用したいからです。NavBar の戻るボタンでキャンセルできます。
したがって、FacebookPostViewControllerは UITextView のデリゲートであり、textView:shouldChangeTextInRange:replacementText:デリゲート メソッドで、改行の挿入を確認してから、 sendTextToFacebookメソッドを呼び出します。
- (void)sendTextToFacebook;
{
// prepare sending
NSMutableDictionary* sendParameters = [NSMutableDictionary dictionaryWithObjectsAndKeys:self.textView.text, @"message", nil];
// request sending to own feed
[[FacebookController sharedFacebookController].facebook requestWithGraphPath:@"me/feed" andParams:sendParameters andHttpMethod:@"POST" andDelegate:self];
}
ご覧のとおり、 FBRequestDelegateとしてselfを指定しているので、実装も行います。
- (void)request:(FBRequest *)request didFailWithError:(NSError *)error;
- (void)request:(FBRequest *)request didLoad:(id)result;
投稿が成功したかどうかをユーザーにフィードバックします。
ただし、Facebook サーバーが応答するまでに時間がかかることがわかったので、2 つのデリゲート メソッドのいずれかが呼び出されるまで、完全な UI を非アクティブにしたいと考えています。したがって、次の方法を実装しました。
- (void)disableUserInterface;
{
self.textView.editable = NO;
self.loginButton.enabled = NO;
self.logoutButton.enabled = NO;
[self.navigationItem setHidesBackButton:YES animated:YES];
[self.spinner startAnimating];
self.spinner.hidden = NO;
}
私の問題は、self.textView.editable = NOを呼び出すとキーボードが非表示になることです。これはばかげているように見えます。その行を削除してもキーボードは消えませんが、ユーザーはテキストが Facebook に送信されている間に textView の内容を変更できます。ただし、投稿はすでに開始されているため。これらの変更は実際には Facebook に表示されません。
別の UITextViewDelegate メソッドを簡単に実装できると思いました。
- (BOOL)textViewShouldEndEditing:(UITextView *)textView
{
return NO;
}
UIの結果は、まさに私が望んでいたものです。ただし、後でFacebookPostViewControllerをポップし、別のビューをUINavigationControllerにプッシュすると、これは EXC_BAD_ACCESS クラッシュにつながります。それらのエラーは
*** -[UITextView isKindOfClass:]: message sent to deallocated instance 0x20c650
だから、私の問題を解決して UITextView を編集できないようにする方法を知っている人はいますか?!?