質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Q&A

2回答

1710閲覧

既存ビューのdelegate拡張

noppefoxwolf

総合スコア231

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

0グッド

0クリップ

投稿2015/05/08 09:08

AATableViewというUITableViewを継承したビューを作り、
このAATableViewではdidSelectRowAtIndexPath:をする際にAATableViewの中でdeselectRowAtIndexPath:を行った後、通常のdelegateの処理を行いたいという場合どのように作ればよいのでしょうか?

CustomViewを作り、その上にUITableViewをaddSubViewしdelegateを貼る設計ではdelegateをすべてrespondsToSelectorで受け流す必要があり、またUIViewのサブクラスとなってしまうのは不本意です。

あくまでUITableViewとして使え、タップした際には自動的にdeselectRowAtIndexPath:してくれるビューを作りたいと考えています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2015/06/11 16:27

本当に自動的にセルの選択解除をしたいのですか? それとも、ボタンを押したときのように、セルをフリックさせたいだけですか?
noppefoxwolf

2015/06/11 18:09

期待値としてはあくまでセルの動作は問題ではなく、UITableViewサブクラス内に自身のDelageteを設定しそのサブクラスのDelegate先へサブクラス内で処理した後のdelegateを送りたいというのがこの投稿の目的です。 1つ1つのdelegateを実装すれば良いのだと思いますが、一括してバイパス出来る方法を探しています。
guest

回答2

0

lang

1@interface AATableView : UITableView <UITableViewDelegate> 2@property(nonatomic,weak) id<UITableViewDelegate> subdelegate; 3@end 4 5@implementation AATableView 6- (void)init { 7 ...(中略)... 8 self.delegate = self; 9} 10 11...(中略)... 12 13- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath { 14 [tableView deselectRowAtIndexPath:indexPath animated:YES]; 15 [subdelegate tableView:tableView didSelectRowAtIndexPath:indexPath]; 16} 17@end

こんな感じですか?

lang

1@implemetation AATableView 2{ 3 id<UITableViewDelegate> _subdelegate; 4} 5 6- (void)setDelegate:(id<UITableViewDelegate>)delegate { 7 _subdelegate = delegate; 8 super.delegate = self; 9} 10 11- (BOOL)respondsToSelector:(SEL)aSelector { 12 return [AATableView instancesRespondToSelector:aSelector] || [_subdelegate respondsToSelector:aSelector]; 13} 14 15- (id)forwardingTargetForSelector:(SEL)aSelector { 16 return [_subdelegate respondsToSelector:aSelector] ? _subdelegate : nil; 17} 18 19- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 20 [tableView deselectRowAtIndexPath:indexPath animated:YES]; 21 [_subdelegate tableView:tableView didSelectRowAtIndexPath:indexPath]; 22}

では、こんな感じでどうですか?

投稿2015/06/12 14:08

編集2015/06/13 05:55
Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noppefoxwolf

2015/06/13 01:22

機能的にはそのような動作を想定しています。 ただ、この場合全てのdelegate,DataSourceに対してこのように施さなければならないと思うのですがそうするしか無いのでしょうか…?
guest

0

デリゲートの拡張というのは難しいですが、
継承や各デリゲートにdidSelectAtIndexPathを書かなくとも
UITableViewのセルが選択された時にハイライトを消すという方法はあります。

UITableViewのセルが選択されたタイミングは、デリゲートだけでなく、
UITableViewSelectionDidChangeNotificationという通知で受け取る事ができます。

これをAppDelegateなどに書いておくと、全てのUITableViewで選択された時に
didSelectAtIndexPathを呼ぶことが可能です。

lang

1 2- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 3 4 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 5 [nc addObserver:self 6 selector:@selector(didSelectTableViewCellNotification:) 7 name:UITableViewSelectionDidChangeNotification 8 object:nil]; 9 10 return YES; 11} 12 13- (void)didSelectTableViewCellNotification:(NSNotification *)notification 14{ 15 UITableView *tableView = (UITableView *)notification.object; 16 [tableView deselectRowAtIndexPath:tableView.indexPathForSelectedRow animated:YES]; 17}

投稿2015/06/11 15:10

okenProg

総合スコア153

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問