【问题标题】:UITableView Programmatically inside UIScrollView not calling delegate methodsUITableView 以编程方式在 UIScrollView 内不调用委托方法
【发布时间】:2015-04-01 14:21:17
【问题描述】:

我正在尝试使用以下代码在 UIScrollView 中加载几个 UITableViews

int x = 0;
for (int i = 0; i < 14; i++) {

        UITableView *testTableView = [[UITableView alloc] initWithFrame:CGRectMake(x, 0, 150, scrollView.bounds.size.height)];
        testTableView.dataSource = self;
        testTableView.delegate = self;
        [testTableView setTag:i];
        [testTableView reloadData];
        [scrollView addSubview:testTableView];
        x+=155;
    }

    [scrollView setContentSize:CGSizeMake(x, scrollView.bounds.size.height)];

这个问题,uitableview 没有响应任何委托方法。有什么想法吗??

【问题讨论】:

    标签: ios objective-c iphone uitableview uiscrollview


    【解决方案1】:

    由于tableView (继承自)scrollView,问题可能是您的或任何scrollView 委托方法正在为所有表视图以及父scrollView 调用。

    如果是这种情况,您应该检查您的委托方法。例如

    - (void)scrollViewDidScroll: (UIScrollView *)scrollView
    {
        if ([scrollView isEqual:tableView1]){
    
        }else if ([scrollView isEqual:tableView2]){
    
        }else if ([scrollView isEqual:parentScrollView]){
    
        }
    
    }
    

    编辑:

    回答您的评论“我应该如何让 UITableView 调用 UITabelView 委托方法而不是滚动视图委托方法”

    它实际上不是那样工作的。当您设置 testTableView.delegate = self; 时,您还设置了 tableViews 滚动视图委托。这意味着,例如,当 tableView 滚动时,将调用适当的 scrollView 委托方法。 据我所知,做你所要求的方法是检查你所有的委托方法

    if ([scrollView isEqual:parentScrollView]){
       //do all parentScrollView related things
    }
    

    这样,当表视图调用委托方法时,它什么也不做

    有关继承协议的更多信息,请参阅here

    【讨论】:

    • MendyK,谢谢你的回答.. 我想你是对的.. 但是我应该如何让 UITableView 调用 UITabelView 委托方法而不是滚动视图委托方法?
    • 是的,很好的答案。另请注意,UITableViewDelegate 协议扩展了 UIScrollViewDelegate 协议...
    【解决方案2】:

    将它们绑定到一个属性:

    @property (nonatomic, strong) UITableView *tableView1;
    @property (nonatomic, strong) UITableView *tableView2;
    @property (nonatomic, strong) UITableView *tableView3;
    //etc...
    

    然后在你的 for 循环中决定要附加什么属性,如下所示:

    if (x == 1)
        self.tableView1 = testTableView;
    else if (x == 2)
        self.tableView2 = testTableView;
    

    在绑定属性后将委托设置为 self。

    self.tableView1.delegate = self;
    

    还要确保您的 ViewController 可以接收来自 UITableView 的委托调用:

    @interface ViewController () <UITableViewDataSource, UITableViewDelegate>
    

    --编辑--

    这张图片显示了对我有用的代码。我在 tableView 上按了一行,标签为 1 两次,得到了两次 NSLog,所以调用了委托方法:

    按下带有标签 1 的 tableView 时应用看起来是这样的:

    【讨论】:

    • 迈克尔,谢谢你的回答。问题是表格视图的数量是动态的。它取决于服务器提供的元素数组。
    • 啊,我明白这就是您使用标签的原因。您是否已经在界面中添加了
    • 或者添加Subview后重新加载tableView。
    • 我将 添加到我的 .h 文件中。我还尝试在添加子视图后重新加载 tableview,但行为仍然相同。
    • 不错!祝您的应用好运,如果有用,请将我的回答标记为有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多