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 类中实现
IUITableViewDelegate
和 IUITableViewDataSource
。然后在我的 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:不会调用覆盖函数的主要内容,如果未能解决你的问题,请参考以下文章
Monotouch - 在 monotouch 项目中附加 Sqlite 数据库并部署到 iPad