3

DiscountListTableViewControllerアプリで別の画面として表示されます。PlaceDetailsViewControllerしかし、下部に関連する割引を表示する必要がある別の画面 ( ) があります。

現在、PlaceDetailsViewController.viewをコンテナーとして持っており、このコンテナーにofUIScrollViewを追加しています。これは機能し、テーブル ビューは正しく表示されますが、セルのクリックを受け取ることができません。DiscountListTableViewController.tableViewUIScrollView.contentviewDidLoadPlaceDetailsViewController

私はUITableViewから継承していることを知っていますがUIScrollView、それはどういうわけかアドバイスされていません(ただし、制限されていません)。ただし、疎結合の観点からは、すべてのコンポーネントを別の場所で独立して使用できるように設計する必要がありDiscountListTableViewController、私の場合はそうです。

PlaceDetailsViewControllerコンポーネントはそのまま必要なDiscountListTableViewControllerので、直接使用できない論理的な理由はありません。助言がありますか?

4

6 に答える 6

28

回答 :しないでください。

UITableview----> から継承されます UIScrollView : UIView : UIResponder : NSObject

アップルは次のように述べています。

重要: UIWebView または UITableView オブジェクトを UIScrollView オブジェクトに埋め込まないでください。これを行うと、2 つのオブジェクトのタッチ イベントが混同され、誤って処理される可能性があるため、予期しない動作が発生する可能性があります。

于 2013-06-15T08:18:32.980 に答える
7

お勧めしませんか?これを読んだ後、「やってはいけないこと」のように感じました。予測不可能性は、アプリにとって決して良い動作ではありません。

重要: UIWebView または UITableView オブジェクトを UIScrollView オブジェクトに埋め込まないでください。これを行うと、2 つのオブジェクトのタッチ イベントが混同され、誤って処理される可能性があるため、予期しない動作が発生する可能性があります。

于 2013-06-15T08:15:34.550 に答える
4

2020 年の更新、swift 5.X は、あなたのtableview内部を可能にしますscrollview!

  1. UITableView のサブクラスを作成します。

     import UIKit
    
     final class ContentSizedTableView: UITableView {
         override var contentSize:CGSize {
             didSet {
                 invalidateIntrinsicContentSize()
             }
         }
    
         override var intrinsicContentSize:CGSize {
             layoutIfNeeded()
             return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
         }
     }
    
  2. レイアウトに UITableView を追加し、すべての面に制約を設定します。そのクラスを ContentSizedTableView に設定します。

  3. intrinsicContentSizeStoryboard はサブクラスを考慮しないため、いくつかのエラーが表示されるはずです。実行時に ContentSizedTableView クラスのオーバーライドを使用します

于 2020-04-15T09:02:26.347 に答える
2

それをどのように解決したかを共有します。UIScrollView をサブクラス化し、PlaceDetailsViewController のコンテナー ビューとして使用しました。

@interface PlaceDetailsContainerUIScrollView : UIScrollView

@end

@implementation PlaceDetailsContainerUIScrollView

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
  UIView *result = [super hitTest:point withEvent:event];

  if ([result isKindOfClass:[UIView class]] && (result.tag == kDiscountListTableViewCellTag)
  {
    UITableView *tableView = (UITableView *) [[result.superview superview] superview];

    return tableView;

  }

  return result;
}
@end

また、PlaceDetailsContainerUIScrollView.delaysContentTouches = YES および PlaceDetailsContainerUIScrollView.canCancelContentTouches = NO に設定することを忘れないでください。

また、DiscountListTableViewController メソッドに小さな修正が必要でした:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  DiscountDetailsViewController *discountDetailsVC = [[DiscountDetailsViewController alloc] init];

  //[self.navigationController pushViewController:discountDetailsVC animated:YES];   
  // self.navigationController is nill because it's not pushed on nav stack, so will grab the current one:
  AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

  [appDelegate.navigationController pushViewController:discountDetailsVC animated:YES];
}
于 2013-06-15T09:14:45.240 に答える