2012-09-06 20 views
26

配列を使用して詳細情報の公開ボタンが作成されています.... accessoryButtonTappedForRowWithIndexPath:関数が自分のクラスで呼び出されていません。これはtableviewdelegateとtableviewdatasourceデリゲートです。私は、セルに選択したときにaccessoryButtonTappedForRowWithIndexPath:呼び出されません。

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{ 
    NSLog(@"reaching accessoryButtonTappedForRowWithIndexPath:"); 
    [self performSegueWithIdentifier:@"modaltodetails" sender:[self.eventsTable cellForRowAtIndexPath:indexPath]]; 
} 

私が呼び出される関数イマイチを信じるようにつながるコンソールにのNSLogイマイチ印刷...これは、もちろんです。下のスクリーンショットは、私のセルのセットアップ方法を示しています。

enter image description here

+0

は、あなたが適切なクラスへのdataSource&デリゲートを接続しますか? ' - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath' メソッドが呼び出されますか? – Thermometer

+0

はい(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPathが呼び出されています。 – jimbob

答えて

7

あなたはそれを選択するために、セルをクリックしましたか、実際には、細胞上のアクセサリーボタンのインジケーターをクリックしたのですか?あなたの質問からは分かりません。

accessoryButtonTappedForRowWithIndexPathは、セル内のボタンアイコンをクリックしたときに適用され、セルを選択したときには適用されません。

+0

ボタンをクリックした – jimbob

+0

あなたはすべての必要な接続を作成しましたか?両方のテーブルビューのデータソースとファイルの所有者に委任? – Coder

+0

あなたは何が問題なのか調べましたか? – Coder

54

indexPathの行にアクセサリビューが設定されているときに、tableView:accessoryButtonTappedForRowWithIndexPath:メソッドが呼び出されていないことを示しています。このメソッドは、accessoryViewプロパティがnilであり、accessoryTypeプロパティを使用して組み込みのアクセサリビューを表示するときにのみ呼び出されます。私が理解しているように、accessoryViewaccessoryTypeは互いに排他的です。 accessoryTypeを使用すると、システムはtableView:accessoryButtonTappedForRowWithIndexPath:を予期して呼び出しますが、自分で処理する必要があります。

Appleがこれを行う方法は、SDKのAccessoryサンプルプロジェクトに示されています。 dataSourceデリゲートのcellForRowAtIndexPathメソッドでは、ターゲット/アクションをカスタムアクセサリボタンに設定します。 1は、アクションにindexPathを渡すことはできませんので、彼らは、対応するindexPathを取得するための補助メソッドを呼び出すと、彼らは、デリゲートメソッドに結果を渡す:何らかの理由で

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    ... 

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    ... 

    // set the button's target to this table view controller so we can interpret touch events and map that to a NSIndexSet 
    [button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside]; 
    ... 
    cell.accessoryView = button; 

    return cell; 
} 


- (void)checkButtonTapped:(id)sender event:(id)event{ 
    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentTouchPosition = [touch locationInView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition]; 
    if (indexPath != nil){ 
     [self tableView: self.tableView accessoryButtonTappedForRowWithIndexPath: indexPath]; 
    } 
} 

、セットアップはに落ちるように見えますアクセサリーケースの場合。 Interface Builderを使用する代わりにaccessoryTypeをコードで設定しようとしましたか?

+0

私は同じ問題を抱えており、TableViewCellインスペクタペインでアクセサリを選択したときに 'AccesoryType'ではなく' AccessoryView'を設定しているXcode 4.5 IBにバグがあるかどうか疑問です。いずれかで動作しない公開インジケータからクリックしてドラッグすることでセグを作成した場合 – drew

+4

クイックアップデート - 'Disclosure'だけでなく、アクセサリータイプを' DetailDisclosure'に設定すると、 'accessoryButtonTappedForRowWithIndexPath'メソッドが呼び出され、トリガーセグが機能するように見えます。なぜ私はまだ動かないのですか?しかし、少なくともUIはあなたが望むように見えない場合でも、いくつかの進歩を遂げることができます。 – drew

+1

これはXcodeのバグですか、それとも意図した動作ですか?アップル社のドキュメントはこれを不安定にしています。表のセルには2つのタイプの開示インジケータがありますが、一般的な開示と詳細開示がありますが、ドキュメントは単に「開示ボタン」と言います。 – SteveCaine

2

が掲載されています。

ストーリーボードで「DetailDisclosure」に変更すると、メソッドが起動します。 (Xcodeの4.6 DP3)これは非常に関連すると思われる

36

...

ディスクロージャー・インジケータ:この要素が存在する場合、ユーザーは階層またはで次のレベルを確認するために行の任意の場所をタップすることができます知っていますリストアイテムに関連付けられた選択肢。別のリストの表示で行結果を選択するときは、行内の公開インジケータを使用します。開示項目を使用して、リスト項目に関する詳細情報を表示しないでください。その代わりに、詳細開示ボタンを使用してください。

詳細開示ボタン:この項目をタップすると、リスト項目に関する詳細情報が表示されます。詳細については、「詳細表示ボタン」を参照してください。)テーブルビューでは、行内の詳細開示ボタンを使用して詳細を表示します(詳細については、「詳細表示ボタン」を参照してください)。リスト項目詳細開示ボタンは、開示区分とは異なり、行の選択とは別のアクションを実行できます。たとえば、Phone Favoritesで、行をタップすると連絡先への呼び出しが開始されます。行の詳細開示ボタンをタップすると、連絡先に関する詳細情報が表示されます。

+1

詳細情報へのリンク:https://developer.apple.com/library/ios/documentation/userexperience/conceptual/mobilehig/Controls.html –

+0

この問題が見つかり、このソリューションは私のために働いた – sapatos

8

UITableViewCellAccessoryTypeのマニュアルによると、それは期待される動作です:

typedef enum : NSInteger {  
UITableViewCellAccessoryNone, 
UITableViewCellAccessoryDisclosureIndicator, 
UITableViewCellAccessoryDetailDisclosureButton, 
UITableViewCellAccessoryCheckmark, 
UITableViewCellAccessoryDetailButton } UITableViewCellAccessoryType; 

定数UITableViewCellAccessoryNoneセルは任意の アクセサリビューを持っていません。これがデフォルト値です。

UITableViewCellAccessoryDisclosureIndicatorセルには、アクセサリ のシェブロンの形をしています。このコントロールは、 セルをタップするとプッシュアクションがトリガーされることを示します。コントロールのタッチを追跡しません。

UITableViewCellAccessoryDe​​tailDisclosureButtonセルには、情報 ボタンとシェブロンイメージがコンテンツとしてあります。このコントロールは、 セルをタップすると、ユーザーがセルの内容を構成できることを示します。 コントロールトラックがタッチします。

UITableViewCellAccessoryCheckmarkセルには、 右側にチェックマークが付いています。このコントロールのタッチを追跡しません。 テーブルビューのデリゲートは、 tableView:didSelectRowAtIndexPath:メソッドで、行の一部のチェックマーク(セクションの1つの行にチェックマークを制限する )を管理できます。

UITableViewCellAccessoryDe​​tailButtonセルにはシェブロンのない情報ボタン があります。このコントロールは、セル をタップすると、セルの内容に関する追加情報が表示されることを示します。コントロール トラックタッチ。

0

これは、ストーリーボードを使用して開示ボタンを処理する別の方法です。テーブルビューのセルをクリックし、接続インスペクタに移動します。 Triggered Seguesと呼ばれるセクションがあり、選択した行から次のUIViewControllerにドラッグすることができます。 segueは自動的に実行され、prepareForSegueをキャプチャして通知を取得することができます。
accessoryButtonTappedForRowWithIndexPath関数は、公開ボタンには決して呼び出されません。それは詳細開示ボタンのためだけに呼び出されます。スウィフト3トップの答えの変換

3

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    ... 
    let unseletcedImage = UIImage(named: "<imagename>") 
    let seletcedImage = UIImage(named: "<imagename>") 
    let button = UIButton(type: .custom) 
    // match the button's size with the image size 
    let frame = CGRect(x: CGFloat(0.0), y: CGFloat(0.0), width: CGFloat((unseletcedImage?.size.width)!), height: CGFloat((unseletcedImage?.size.height)!)) 
    button.frame = frame 
    button.setBackgroundImage(unseletcedImage, for: .normal) 
    button.setBackgroundImage(seletcedImage, for: .selected) 
    cell?.accessoryView = button 
    let action = #selector(checkButtonTapped(sender:event:)) 
    (cell?.accessoryView as? UIButton)?.addTarget(self, action: action, for: .touchUpInside) 
    .... 
    return cell! 

} 

@objc func checkButtonTapped(sender: UIButton?, event: UIEvent) { 
    let touches = event.allTouches 
    let touch = touches!.first 
    guard let touchPosition = touch?.location(in: self.tableView) else { 
     return 
    } 
    if let indexPath = tableView.indexPathForRow(at: touchPosition) { 
     tableView(self.tableView, accessoryButtonTappedForRowWith: indexPath) 
    } 
} 
関連する問題