2009-08-20 12 views
2

私はカスタムセルでtableViewを使用しています。 navigationControllerのpushViewController関数を使用して別のビューを表示する場合は、テキストフィールドをループし、resignFirstResponderを呼び出します。しかし、resignFirstResponderは、テキストフィールドが表示されているときにのみ機能し、最初にページの上部にスクロールします。これはコードです:tableView frame.origin after textField resignFirstResponder in custom tableViewCell

NSIndexPath *topIndexPath; 
topIndexPath = [[NSIndexPath indexPathWithIndex:0] indexPathByAddingIndex:0]; 
[self.tableView scrollToRowAtIndexPath:topIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

[[self textFieldForRow:0] resignFirstResponder]; 
[[self textFieldForRow:1] resignFirstResponder]; 
[[self textFieldForRow:2] resignFirstResponder]; 
[[self textFieldForRow:3] resignFirstResponder]; 

これは動作しますが、この後、私のtableViewは、その起源を持ついくつかの奇妙な問題を抱えています。私はsuperviews起源を0に設定しようとしましたが、それは助けになりません。ここで

は、問題のスクリーンショットです:​​

あなたが見ることができるように、私のテーブルビューが大きすぎると下部に到達したときにスクロールバーがビューの真ん中で立ち往生しています。

私の英語のため申し訳ありませんが、私は事前に

おかげで、あなたは私を理解することができますことを願っています!

ハンス

答えて

2

実際は非常に簡単でした。ただ、-viewWillDisappear

編集にごresignFirstResponderを置く:これはより良く、より少ないハックですが、私は私のクラスにこれを追加し、それが働いた:

編集2:前のコードを使用しているときにアプリが拒否されると思われるが。

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [self.view findAndResignFirstResponder]; 
} 

そして:

@implementation UIView (FindAndResignFirstResponder) 
- (BOOL)findAndResignFirstResponder 
{ 
    if (self.isFirstResponder) { 
     [self resignFirstResponder]; 
     return YES;  
    } 
    for (UIView *subView in self.subviews) { 
     if ([subView findAndResignFirstResponder]) 
      return YES; 
    } 
    return NO; 
} 
@end 

(ソース:Get the current first responder without using a private API)ここで更新され、公開APIのバージョンである

+0

このメソッドを使用しているため、誰かのアプリがアプリストアから拒否されています。あなたが興味を持っているなら、このスレッドにあります。 http://stackoverflow.com/questions/1823317/how-do-i-legally-get-the-current-first-responder-on-the-screen-on-an-iphone –

+0

ありがとうございました。コード。 – HansPinckaers

0

私はあなたの他の問題を解決します。他のtextFieldsが画面に表示されているときに「resignFirstResponder」と呼ぶことができないと言ったとき、クラッシュがあると思いますか?

もしそうなら、それはスクリーンセルが存在しないためであり、従ってテキストフィールドも消えてしまいます。それらはリサイクルされます(新しいセルのためにデキューできます)。

簡単な解決方法は、画面上にあるテキストフィールド上でのみresignFirstResponderを呼び出すことです。

あなたが今やっていることは少しハッキリしているようです。

+0

は、問題は私のtableViewが一番下にあるときに、何のテキストフィールドが表示されていないですが、キーボードは引き続き表示されます。テキストフィールドが画面から離れようとしているときにキーボードを辞める方法はありますか? – HansPinckaers

関連する問題