填充UITableView的正确位置在哪里?

时间:2017-02-06 09:50:58

标签: ios uitableview xamarin xamarin.ios

我的ViewController中有一个UITableView。要填充它,我必须提出一个async请求,可能需要一秒钟才能完成。我应该把它放在哪里?

当我尝试使ViewDidLoad异步并从那里进行调用时,ViewWillLayoutSubviews会抛出错误,因为它会尝试定位一些尚未分配的元素 - 因为事实并非如此来自ViewDidLoad的所有代码都已执行(我认为)。

3 个答案:

答案 0 :(得分:2)

等待ViewDidLoad中的任何内容之前,您需要设置所有视图逻辑。否则,ViewDidLoad方法返回时,视图初始化将不会完成。这可能是ViewWillLayoutSubviews失败的潜在原因。如果仍然失败,请使用try / catch确保您的服务正常运行:

public override async void ViewDidLoad()
{
    base.ViewDidLoad();

    // setup all the view elements here (before the async call)

    try 
    {
        var results = await MakeYourAsyncRequest();

        InvokeOnMainThread(() =>
        {
            _tableView.Source = ...; // do something with the results
            _tableView.ReloadData();
        });
    }
    catch(Exception ex)
    {
        // do something with the exception
    }
}

答案 1 :(得分:0)

尝试将 tableView.ReloadData(); 方法放在

dispatch_async(dispatch_get_main_queue(),^ {} 这可能会解决您的问题。

  

- :作为一般规则,您应该尝试确保所有UI交互都发生在主线程上。您的数据提取任务将在后台运行。看起来你正在调用你的重装数据   背景线程,似乎有风险。

答案 2 :(得分:0)

根据数据,我会将呼叫置于 router.post('/data_find', function (req, res) { var database = req.Collection; var start_date = req.body.start_date; var end_date = req.body.end_date; if (start_date.length > 0 && end_date.length > 0) { database.find({ "item_blocked_on.start_date": {$gte: start_date}, "item_blocked_on.end_date": {$lt: end_date},function(err,user){ if (err) { res.json({status: 0, message: err}); } if (!user) { res.json({status: 0, msg: "not found"}); } res.json({status: 1, id: user._id, message: " success"}); }) } else { res.json({status: 0, msg: "Invalid Fields"}); } }); 。当应用程序启动时,应该提取并保存数据。

当您的AppDelegate出现时,它已经准备好数据或者可能是错误消息,因为您已经知道了获取的结果。

数据可能会改变这一点,这也是为什么我还要将UITableview的{​​{1}}中的抓取电话与viewWillAppear()放在一起。

ViewController是一种只被调用一次的方法。它也被称为ViewController生命周期的第一个方法。 如果你仔细阅读它VC lifecycle会很好。 您可以使用UITableview

在代码中尝试来帮助自己