1

私のMonoDevelopプロジェクトには、iPhoneアプリがあります。私には2つの異なる見方があります。各ビューにはUITableが含まれています。ビュー1の場合、クラス1をデータソース1としてUITableViewControllerにフックしました。このクラスは、InterfaceBuilderのUITableViewControllerクラスプロパティで指定されます。

ビュー2の場合、データソース2として接続されたクラス2があります。UITableViewControllerクラスプロパティのインターフェイスビルダーにも接続されています。両方のクラス(つまり、データソース)がテーブルにデータを供給します。ビュー2にもカスタムセルがあり、このため非同期で読み込まれます。

linqtoxmlを使用して2つのxmlファイルからデータを取得します。すべてが機能し、データの読み込みが良好です。私が知る必要があるのは、ビュー1で行った選択に基づいてデータソース2にデータをロードすることです。これを行うには、ビュー1からクラス(データソース)2にIDを渡す必要があります。 IDが読み込まれます。問題は、ナビゲーションコントローラーをもう一度タップして、最初の画面で選択範囲(ID)を変更すると、まったく同じデータが表示され、UITableが新しい選択範囲で更新されないことを示します。

ラウンド(ID)をロードするデータソースコード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using System.Data;

namespace CurrieCup2012
{
    [MonoTouch.Foundation.Register("FixturesTableViewController")]
    
    public partial class MyTableViewController : UITableViewController
    {
        static NSString CellID = new NSString ("MyIdentifier");
        List<Fixtures> Fixtures;
        
        // Constructor invoked from the NIB loader
        public MyTableViewController (IntPtr p) : base (p)
        {
            
        }
        
        
        // The data source for our TableView
        class DataSource : UITableViewDataSource
        {
            MyTableViewController tvc;
            
            public DataSource (MyTableViewController tableViewController)
            {
                this.tvc = tableViewController;
            }
            
            public override int RowsInSection (UITableView tableView, int section)
            {
                return tvc.Fixtures.Count;
            }

            public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
            {
                var cell = tableView.DequeueReusableCell (CellID);
                if (cell == null)
                {
                    cell = new UITableViewCell (UITableViewCellStyle.Default, CellID);
                }
            
                // Customize the cell here...
            
                Fixtures fixtures = tvc.Fixtures.ElementAt(indexPath.Row);
                cell.TextLabel.Text = fixtures.RoundID;
                
                cell.Accessory = UITableViewCellAccessory.DisclosureIndicator;
                
                return cell;
            }
        }
    
        // This class receives notifications that happen on the UITableView
        class TableDelegate : UITableViewDelegate
        {
            MyTableViewController tvc;

            public TableDelegate (MyTableViewController tableViewController)
            {
                this.tvc = tableViewController;
            }
            
            DetailFixturesViewer detailsViewController;
            //SelectedRound round = new SelectedRound();
            
            public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
            {
                if (detailsViewController == null)
                detailsViewController = new DetailFixturesViewer();
                
                Fixtures fixtures = tvc.Fixtures.ElementAt(indexPath.Row);
                //Console.WriteLine(fixtures.RoundID);
                detailsViewController.CurrentFixtures = fixtures;
                IntPtr vd;
                MyTableViewController2 mtv = new MyTableViewController2(vd);
                mtv.round = fixtures.RoundID;

            //  round.RoundID =  tvc.Fixtures.ElementAt(indexPath.Row).RoundID;
                
            
            //  Console.WriteLine("Set Selected round on row selected: " + round.RoundID);
                
                //SelectedRound selround = new SelectedRound();
                //selround.RoundID = fixtures.RoundID;
                
                SelectedRound.RoundID = fixtures.RoundID;
                    
                //Console.WriteLine(round.RoundID);
                //Console.WriteLine(indexPath.Row.ToString());
                //Console.WriteLine(newsArticle.Headline.ToString());
                //Console.WriteLine(newsArticle.Link.ToString());
                tvc.NavigationController.PushViewController(detailsViewController, true);
                tvc.NavigationController.ViewWillAppear(true);
                detailsViewController.CurrentFixtures.RoundID = fixtures.RoundID;
                detailsViewController.CurrentFixtures.Date = fixtures.Date;
                detailsViewController.Title = fixtures.RoundID;
            }
        }

        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();
            //Console.WriteLine("Linq");
            XDocument rss =
            XDocument.Load("http://curriecup.dutch-vegas.com/XML/rounds.xml");
            
            var query = from item in rss.Descendants("Round")
                select new Fixtures 
                       {
                            RoundID = "Round " + (string) item.Element("roundid"),
                            Date = (string) item.Element("date")
                            /*GameID = (string) item.Element("gameid"),
                            Team1 = (string) item.Element("team1"),
                            Team2 = (string) item.Element("team2"),
                            Team1Image = (string) item.Element("team1image"),
                            Team2Image = (string) item.Element("team2image"),
                            Date = (string) item.Element("date"),
                            Location = (string) item.Element("location")*/
                       };
            
            Fixtures = query.Distinct().ToList();
            
            TableView.Delegate = new TableDelegate (this);
            TableView.DataSource = new DataSource (this);
            Title = "Rounds";
            
        }
    }
}

データソース1からのラウンド(ID)選択に基づいて詳細データをロードするデータソース:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using System.Data;
using System.IO;

namespace CurrieCup2012
{
    [MonoTouch.Foundation.Register("DetailFixturesTableViewController")]

    public partial class MyTableViewController2 : UITableViewController
    {
        static NSString CellID2 = new NSString ("MyIdentifier2");
        List<DetailFixtures> DetailFixtures;
        
        public string round{ get; set; }

        // Constructor invoked from the NIB loader
        public MyTableViewController2 (IntPtr p) : base (p)
        {
            
        }
        
        
        // The data source for our TableView
        class DataSource : UITableViewDataSource
        {
            
            MyTableViewController2 tvc;
            
            public DataSource (MyTableViewController2 tableViewController)
            {
                
                this.tvc = tableViewController;
            }
            
            public override int RowsInSection (UITableView tableView, int section)
            {
                return tvc.DetailFixtures.Count;
            }

            public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
            {
                Dictionary<int,FixturesCell> _cellControllers = new Dictionary<int, FixturesCell>();
                var cell2 = tableView.DequeueReusableCell (CellID2);
                FixturesCell fixtureCell = null;
                DetailFixtures detailfixtures = tvc.DetailFixtures.ElementAt(indexPath.Row);
                
                if (cell2 == null)
                {
                    //cell2 = new UITableViewCell (UITableViewCellStyle.Default, CellID2);
                    fixtureCell = new FixturesCell();
                    cell2 = fixtureCell.Cell;
                    cell2.Tag = Environment.TickCount;
                    _cellControllers[cell2.Tag] = fixtureCell;
                }
                else
                {
                    fixtureCell = _cellControllers[cell2.Tag];
                }
            
                // Customize the cell here...
                
                fixtureCell.Team1 = detailfixtures.Team1;
                fixtureCell.Team2 = detailfixtures.Team2;
                fixtureCell.Location = detailfixtures.Location;
                fixtureCell.Date = detailfixtures.Date;
                
                if(!string.IsNullOrEmpty(detailfixtures.Team1Image))
                {
                    if(File.Exists("Images/"+detailfixtures.Team1Image))
                    {
                        fixtureCell.Team1Image = UIImage.FromFile("Images/"+detailfixtures.Team1Image); 
                    }
                }
                
                if(!string.IsNullOrEmpty(detailfixtures.Team2Image))
                {
                    if(File.Exists("Images/"+detailfixtures.Team2Image))
                    {
                        fixtureCell.Team2Image = UIImage.FromFile("Images/"+detailfixtures.Team2Image); 
                    }
                }
            
                /*DetailFixtures detailfixtures = tvc.DetailFixtures.ElementAt(indexPath.Row);
                cell2.TextLabel.Text = detailfixtures.Team1;
                
                //cell.Accessory = UITableViewCellAccessory.DetailDisclosureButton;*/
                
                return cell2;
            }
        }
    
        // This class receives notifications that happen on the UITableView
        class TableDelegate : UITableViewDelegate
        {
            MyTableViewController2 tvc;

            public TableDelegate (MyTableViewController2 tableViewController)
            {
                this.tvc = tableViewController;
            }
            
            
            
            public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
            {
                /*if (detailsViewController == null)
                detailsViewController = new DetailFixturesViewer();
                
                DetailFixtures detailFoxtures = tvc.DetailFixtures.ElementAt(indexPath.Row);
                detailsViewController.CurrentFixtures = fixtures;
                //Console.WriteLine(indexPath.Row.ToString());
                //Console.WriteLine(newsArticle.Headline.ToString());
                //Console.WriteLine(newsArticle.Link.ToString());
                tvc.NavigationController.PushViewController(detailsViewController, true);
                tvc.NavigationController.ViewWillAppear(true);*/
            }
        }

        
        public override void ViewDidLoad ()
        {
            //SelectedRound selround = new SelectedRound();
            
            string selectedRound = SelectedRound.RoundID.Replace("Round ", "");
            Console.WriteLine("read selected Round viewdidload table class: " + selectedRound);
            
            base.ViewDidLoad ();
            
            XDocument rss =
            XDocument.Load("http://curriecup.dutch-vegas.com/XML/fixtures.xml");
            
            var query = from item in rss.Descendants("Game") where (string) item.Element("roundid") == selectedRound
                select new DetailFixtures 
                       {
                            //RoundID = "Round " + (string) item.Element("roundid")
                            GameID = (string) item.Element("gameid"),
                            Team1 = (string) item.Element("team1"),
                            Team2 = (string) item.Element("team2"),
                            Team1Image = (string) item.Element("team1image"),
                            Team2Image = (string) item.Element("team2image"),
                            Date = (string) item.Element("date"),
                            Location = (string) item.Element("location")
                       };
            //Console.WriteLine("test");
            DetailFixtures = query.Distinct().ToList();
            TableView.Delegate = new TableDelegate (this);
            TableView.DataSource = new DataSource (this);
            //Title = "Fixtures";
            Console.WriteLine("Reload");
        }
    }
}

テーブルでReloadData()メソッドを呼び出そうとしましたが、役に立ちませんでした。モノタッチは初めてです。

4

1 に答える 1

0

最も簡単な方法は、既存のインスタンスを再利用するのではなく、毎回View2の新しいインスタンスを作成することです。

View2を再利用しても問題はありません。問題がどこにあるかを正確に特定するには、さらにデバッグが必要になります。

于 2012-06-13T17:51:17.547 に答える