2011-03-14 30 views
1

サブクラス内からUITableViewControllerパラメータにアクセスするにはどうすればよいですか?サブクラス化されたUITableViewCell内からUITableViewController変数にアクセスするには?

Iは、フォントサイズのUITableViewController内のパラメータ(すなわち、ユーザーがフォントサイズを変更することができる)を有します。そのため、UITableViewCellのカスタムサブクラスでlayoutSubviewsメソッドを使用すると、レイアウトを変更する必要があるときに最新のフォントにアクセスする必要があります(ラベルの位置はフォントによって異なります)。

だから私のカスタムでの私の質問は、UITableViewCellをサブクラス化し、具体的layoutSubviewsメソッド内で、どのように私はUITableViewControllerからインスタンス変数である「uiFont」パラメータにアクセスできますか?あなたのセル内からUITableViewControllerオブジェクトへのアクセス

答えて

2

は、デザインの面では良い方法ではありません。 、あなたのtableView:cellForRowAtIndexPath方法で

@interface CustomCell : UITableViewCell { 
    UIFont *font; 
} 
@property (nonatomic, retain) UIFont *font; 

そして、セルのフォントを設定します:あなたがやるべきことはUIFontオブジェクトを格納するテーブルのセル自体にIVARを作成している

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ... 
    [cell setFont:uiFont]; 
    ... 
} 
+0

ああ、私はあなたがindragieを意味するものを見る - これに私のアプローチを変更します - おかげで – Greg

+0

ああ、実際にユーザーがテーブルビューをスクロールせずにツールバーを経由してフォントサイズを変更した場合、何?これは "cellForRowAtIndexPath"がトリガされないことを意味しませんか?もしそうなら、(a)レイアウトビューのコールバックを開始し、(b)layoutViews内でフォントの新しいバージョンを取得する方法です。 – Greg

+0

ユーザーがフォントを変更するときは、[tableView reloadData]を呼び出すだけです。これでcellForRowAtIndexPathが呼び出され、フォントが更新されます。 – indragie

4

ありますそれを行うにはいくつかの方法:、(あなたはどこにでも[UIApplication sharedApplication].delegateを使用してからアクセスすることができます)アプリケーションデリゲートのプロパティを経由してのUITableViewControllerにアクセスあなたがtableView:cellForRowAtIndexPath:でそれを作成するときに、セルにのUITableViewControllerへの参照を与える、またはからUIResponderチェーンをたどりますあなたがUITableViewControlleを見つけるまで、セルのビューr。

しかし、実際には、これはおそらく貧しいアーキテクチャです。テーブルビューでreloadDataを呼び出すだけで、すべてのセルが再作成され、フォントがtableView:cellForRowAtIndexPath:に設定されるはずです。または、フォント設定を維持する必要がある場合は、NSUserDefaultsに格納して、セルにNSUserDefaultsDidChangeNotificationをリスンさせます。

+0

indragie。シナリオ:ユーザーがテーブルビューをスクロールせずにツールバーを使用してフォントサイズを変更するとどうなりますか?これは "cellForRowAtIndexPath"がトリガされないことを意味しませんか?もしそうなら、(a)レイアウトビューのコールバックを開始し、(b)layoutViews内でフォントの新しいバージョンを取得する方法です。 – Greg

+0

'cellForRowAtIndexPath'がトリガされないことを意味します。さらに悪いことに、それらがゆっくりとスクロールすると、古いフォントで画面上のセルの半分と新しいもので半分のセルを持つことができます。あなたは、 'setNeedsLayout'を送信することによって、ビュー自体をレイアウトするように指示します。 – Anomie

+0

これで、これとindragieのアドバイスに基づいて、[tableView reloadData]が順番になっているか、少なくとも最小限のsetNeedsLayoutのようです – Greg

関連する問題