private async Task InitTableViewAsync()
        {
            // delay is need to delay UI thread freezing while TableNode items are loaded
            // thus previous screen will not be frozen
            await Task.Delay(1);

            Table.KeyboardDismissMode = UIScrollViewKeyboardDismissMode.Interactive;
            Table.TranslatesAutoresizingMaskIntoConstraints = false;
            Table.BackgroundColor = UIColor.FromRGB(245, 245, 245);
            Table.AddGestureRecognizer(new UITapGestureRecognizer((obj) => Input.TextView.ResignFirstResponder()));

            var tableSource = new GroupedTableDataSource <DateTimeOffset, ChatMessageViewModel>(
                ViewModel.MessagesList.Messages,
                Table,
                viewModel => GetMessageNode(viewModel),
                TableNode.Inverted);

            Table.EstimatedRowHeight = MinCellHeight;
            Table.SeparatorStyle     = UITableViewCellSeparatorStyle.None;
            _dataSourceRef           = WeakReferenceEx.Create(tableSource);
            TableNode.DataSource     = tableSource;
            TableNode.Delegate       = _tableDelegate;
            TableNode.SetTuningParameters(new ASRangeTuningParameters {
                leadingBufferScreenfuls = 1, trailingBufferScreenfuls = 1
            }, ASLayoutRangeType.Display);
            TableNode.SetTuningParameters(new ASRangeTuningParameters {
                leadingBufferScreenfuls = 1, trailingBufferScreenfuls = 1
            }, ASLayoutRangeType.Preload);
            TableNode.ReloadData();
            TableNode.LeadingScreensForBatching = 3;
        }