Xamarin C # Два UITableViewCells в одном UITableView

1

Я пытаюсь поместить два разных UITableViewCell в один UITableView однако, когда я пытаюсь загрузить данные в TableSource это позволяет мне одновременно отправлять только один List<>. Однако мне нужно два List<> для отображения обеих ячеек. Два TableSource.cs в моем классе TableSource.cs представляют собой общедоступные переменные, называемые instaData и faceData. Когда я запускаю Индивидуальные запросы на получение instaData и faceData, он работает безупречно. Лучше показано, что потом объясняется:

Запрос на InstaData

var client = new RestClient ("https://api.instagram.com/v1");
    client.ExecuteAsync (request, response => {
        var rootObject = JsonConvert.DeserializeObject<RootObject> (response.Content);
        InstagramObject.next_url = rootObject.pagination.next_url.ToString();
        FLDTRequest.instagramDataCopy = rootObject.data;
        table.InvokeOnMainThread (() => {
        table.Source = new TableSource(stream);
        ((TableSource)table.Source).instaData = rootObject.data;
        table.ReloadData ();
        });
    });

Запрос для FaceData

var client = new RestClient ("https://graph.facebook.com/");
                client.ExecuteAsync (request, response => {
                    var rootObject = JsonConvert.DeserializeObject<Floadt.Core.Facebook.RootObject> (response.Content);
                    FLDTRequest.facebookDataCopy = rootObject.data;
                    table.InvokeOnMainThread (() => {
                        table.Source = new TableSource(stream);
                        ((TableSource)table.Source).faceData = rootObject.data;
                        table.ReloadData ();
                    });
                });

В основном я называю оба метода, когда хочу получить обе данные, но обычно получаю ошибку из метода, который я называю последним, говоря, что этот объект не является ссылкой. Например: если я вызываю последний запрос faceData, он сказал бы, что Object не является ссылкой. Вот мой класс TableSource:

public class TableSource : UITableViewSource 
{
    StreamViewController controller;

    public List<Datum> instaData { get; set; }
    public List<string> twitData { get; set; }
    public List<Floadt.Core.Facebook.Datum> faceData { get; set; }

    public TableSource(StreamViewController stream)
    {
        controller = stream;
    }

    public override int RowsInSection (UITableView tableview, int section)
    {
        return faceData.Count;
    }

    public override float GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
    {
        if (indexPath.Row % 2 == 0) {
            return 340;
        } else {
            return 436;
            //return 210;
        }
    }

    public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
    {
        if (indexPath.Row % 2 == 0) {
            NetworkCheck netCheck = new NetworkCheck ();
            netCheck.runCheck ();
            // bool log = netCheck.anyLoggedIn ();

            if (tableView.ContentSize.Height - UIScreen.MainScreen.Bounds.Height <= tableView.ContentOffset.Y) {
                BTProgressHUD.Show ("Getting more...");
                FLDTRequest.getInstagramNextPage (tableView);
                BTProgressHUD.Dismiss ();
            }

            var cell = tableView.DequeueReusableCell (InstagramCell.Key) as InstagramCell;

            if (cell == null) {
                cell = new InstagramCell ();
                var views = NSBundle.MainBundle.LoadNib ("InstagramCell", cell, null);
                cell = Runtime.GetNSObject (views.ValueAt (0)) as InstagramCell;
            }

            //Datum h = instaData [indexPath.Row/2];
            //cell.BindData (h);

            return cell;

        } else {
            NetworkCheck netCheck = new NetworkCheck ();
            netCheck.runCheck ();
            // bool log = netCheck.anyLoggedIn ();

            if (tableView.ContentSize.Height - UIScreen.MainScreen.Bounds.Height <= tableView.ContentOffset.Y) {
                BTProgressHUD.Show ("Getting more...");
                FLDTRequest.getInstagramNextPage (tableView);
                BTProgressHUD.Dismiss ();
            }


            var cell = tableView.DequeueReusableCell (FacebookCell.Key) as FacebookCell;

            if (cell == null) {
                cell = new FacebookCell ();
                var views = NSBundle.MainBundle.LoadNib ("FacebookCell", cell, null);
                cell = Runtime.GetNSObject (views.ValueAt (0)) as FacebookCell;
            }

            var fbPhotoCell = tableView.DequeueReusableCell (FacebookPhotoCell.Key) as FacebookPhotoCell;

            if (fbPhotoCell == null) {
                fbPhotoCell = new FacebookPhotoCell ();
                var views = NSBundle.MainBundle.LoadNib ("FacebookPhotoCell", cell, null);
                fbPhotoCell = Runtime.GetNSObject (views.ValueAt (0)) as FacebookPhotoCell;
            }

            Floadt.Core.Facebook.Datum f = faceData [indexPath.Row/2];

            fbPhotoCell.BindData (f);
            return fbPhotoCell;
        }   
    }
}
  • 0
    Какая конкретная строка вызывает исключение «объект не ссылка»? То, как ваш код структурируется при каждой загрузке данных, создает новый TableSource, поэтому вы потеряете данные, которые уже существуют в TableSource.
  • 0
    @ Джейсон Да, я понимаю проблему. Я очень озадачен поиском решения, потому что, как показано в ответе ниже, я не могу просто составить единый список, потому что структуры классов данных FB и Instagram очень разные
Теги:
xamarin
uitableview

2 ответа

1

Похоже, вы пытаетесь установить table.Source дважды, один раз для каждого List? Вам нужно объединить свои списки в один источник данных и создать UITableViewCell который может визуализировать оба типа данных.

  • 0
    Я не смог бы просто объединить оба списка, потому что классы, на которых основаны оба списка, очень сильно различаются, и было бы очень сложно объединить их.
0

1) Перетащите UITableView в ViewController и добавьте ограничения.

2) Добавьте две ячейки Prototype и свяжите их с двумя UITableViewCells.

3) Настройте UITableViewSource (объединяет UITableVIewDataSource и UITableViewDelegate).

    public override void ViewDidLoad ()
            {
                base.ViewDidLoad ();
                // Perform any additional setup after loading the view, typically from a nib.
                this.sampleTableView.Source = new SampleTableViewSource ();     
            }

Добавить класс Source в ViewController.

//Table Source
        public class SampleTableViewSource : UITableViewSource
        {
            string CellIdentifier = "sampleTableViewCellID";
            string CellIdentifier2 = "sampleTableViewCell2ID";

            public override nint RowsInSection(UITableView tableview, nint section)
            {
                return 2;
            }
            public override nint NumberOfSections (UITableView tableView)
            {
                return 1;
            }
            public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
            {
                UITableViewCell cell = new UITableViewCell ();

                //---- if there are no cells to reuse, create a new one

                if (indexPath.Row == 0)
                    {
                    cell = tableView.DequeueReusableCell (CellIdentifier) as SampleTableViewCell;               
                    }
                    else if(indexPath.Row == 1 ) {
                    cell = tableView.DequeueReusableCell (CellIdentifier2) as sampleTableViewCell2;
                    }

                return cell;
            }
            public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
            {
                tableView.DeselectRow (indexPath, true);
        } 
        }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню