Monotouch - UIViewController 中的 tableview:不会调用覆盖函数

Posted

技术标签:

【中文标题】Monotouch - UIViewController 中的 tableview:不会调用覆盖函数【英文标题】:Monotouch - tableview inside UIViewController: override functions don't get called 【发布时间】:2016-07-14 17:39:07 【问题描述】:

我在 UIViewController 中有一个 tableview。我还有一些动态数据,我想将它们加载到这个 tableview 上。到目前为止,我尝试了两种方法:

    我在这个 UIViewController 中创建了一个嵌套的私有类,它继承自 UITableViewSource。然后我在 ViewDidLoad 中创建了这个类的一个新实例,并将它分配给我的表格视图的 Source 属性。

对于此选项,将调用覆盖函数。但是,我在ViewWillAppear 中动态加载列表,因此此时数据源为空。

我尝试在 ViewWillAppear 中创建嵌套类的新实例,但执行此操作时不会调用覆盖函数。只有当我在ViewDidLoad 中执行此操作时才会调用它们。

    我尝试的另一个选项是在我的 UIViewController 类中实现 IUITableViewDelegateIUITableViewDataSource。然后在我的 ViewDidLoad 中将“this”分配给我的表格视图的 WeakDelegate 和 WeakDataSource 属性。

第二个选项我面临的挑战是:我不断收到此错误:

[HomePageController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x185ce440

我已经在函数中添加了这个导出属性,但它并没有解决问题:

[Export ("tableView:numberOfRowsInSection:")]
    public nint RowsInSection (UITableView tableView, nint section)
    
        return 1;
    

我更喜欢第一个选项,但是为什么加载数据后无法在 ViewWillAppear 中初始化类?我需要在这里调用它,因为 ViewDidLoad 只调用一次。

这就是我所做的:

public async override void ViewWillAppear (bool animated)
    
        base.ViewWillAppear (animated);

        try 


            LoadingOverlay loadingOverlay = new LoadingOverlay (UIScreen.MainScreen.Bounds, "Loading...");

            this.View.AddSubview (loadingOverlay);

            await FetchAllData ();

            loadingOverlay.Hide ();

         if (tableViewNotice != null) 

                if(allData != null)
                

                    if(allData.Count > 0)
                    
                        homeDataSource = new HomeDataSource(this);
                        tableViewNotice.Source = homeDataSource;
                    

                

            

   catch (Exception ex) 
            Console.WriteLine (ex.Message + ex.StackTrace);

        

    

【问题讨论】:

【参考方案1】:

当 UITableView 被加载到图层时,它会像调用 viewDidLoad 一样加载数据。但是tableView的数据源是在viewWillAppear中设置的,那就太晚了。所以你需要在 viewDidLoad 函数中设置数据源或设置数据源后调用 reloadData()。

【讨论】:

这确实有效。我在 ViewWillAppear() 中添加了对 tableView.ReloadData() 的调用。此时我可以访问加载的数据。谢谢。

以上是关于Monotouch - UIViewController 中的 tableview:不会调用覆盖函数的主要内容,如果未能解决你的问题,请参考以下文章

UIViewControl之间的七种传值方式

MonoTouch:播放声音

Monotouch - 在 monotouch 项目中附加 Sqlite 数据库并部署到 iPad

Monotouch:了解委托机制模式

如何在 DialogViewController (Monotouch.Dialog) 上设置背景颜色

Monotouch 找不到 AudioFileOpenURL