0

私は XCode と Monotouch の開発に非常に慣れていません。ルート ビュー (マスター/ディテール アプリケーション) に複数のタブを追加しようとしています。開発には Mono を使用し、UI 設計には xCode 4 を使用しています。たとえば、あるタブには従業員のリストが表示され、別のタブには部門のリストが表示されます。

rootviewController.xib ファイルのデフォルトのテーブル ビューを削除し、tabbedview に置き換えましたが、各タブが機能する新しいテーブル ビューを取得できません。

誰かがこれを行う正しい方法を教えていただければ幸いです。

更新: 以下のコードを使用して、2 つのタブと 2 つのテーブル ビューを追加します。1 つは「証券」を保持するためのもので、もう 1 つは「指標」を保持するためのものです。

using System;
using System.Drawing;

using MonoTouch.Foundation;
using MonoTouch.UIKit;
using System.Collections.Generic;

namespace ChartQ
{
public partial class RootViewController : UITabBarController 
{
    public DetailViewController DetailVC { get; set; }

    private List<SecurityInfo> listSecInfo =  new List<SecurityInfo>();
    private List<Indicator> listIndicator =  new List<Indicator>();
    public RootViewController () : base ("RootViewController", null)
    {
        this.Title = NSBundle.MainBundle.LocalizedString ("Securities", "Securities");
        //this.ClearsSelectionOnViewWillAppear = false;
        this.ContentSizeForViewInPopover = new SizeF (100f, 200f);
        //this.ContentSizeForViewInPopover = new SizeF (320f, 600f);

        // Custom initialization
    }

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
        //Read data from Database..
        UITableViewController secController =  new UITableViewController();
        UITableViewController IndiController =  new UITableViewController();

        this.AddChildViewController(secController);
        this.AddChildViewController(IndiController);
        SQLLiteDatabase db =  new SQLLiteDatabase();
        listSecInfo =  db.ReadSecurities();
        listIndicator  = db.ReadIndicator();
        //TableView.Source = new SecuritiesDataSource (this);
        secController.TableView.Source = new SecuritiesDataSource (this);
        secController.TableView.SelectRow (NSIndexPath.FromRowSection (0, 0), false, UITableViewScrollPosition.Middle);

        IndiController.TableView.Source = new IndicatorDataSource (this);
        IndiController.TableView.SelectRow (NSIndexPath.FromRowSection (0, 0), false, UITableViewScrollPosition.Middle);


    }

    public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation)
    {
        // Return true for supported orientations
        return true;
    }

    public override void DidReceiveMemoryWarning ()
    {
        // Releases the view if it doesn't have a superview.
        base.DidReceiveMemoryWarning ();

        // Release any cached data, images, etc that aren't in use.
    }

    public override void ViewDidUnload ()
    {
        base.ViewDidUnload ();


        // Clear any references to subviews of the main view in order to
        // allow the Garbage Collector to collect them sooner.
        //
        // e.g. myOutlet.Dispose (); myOutlet = null;

        ReleaseDesignerOutlets ();
    }
    class SecuritiesDataSource : UITableViewSource
    {
        static NSString cellIdentifier = new NSString ("CellId");
        RootViewController controller;

        public SecuritiesDataSource (RootViewController controller)
        {
            this.controller = controller;
        }

        // Customize the number of sections in the table view.
        public override int NumberOfSections (UITableView tableView)
        {
            return 1;
        }

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

        public override string TitleForHeader (UITableView tableView, int section)
        {
            return "Securities";
        }

        // Customize the appearance of table view cells.
        public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
        {
            string cellIdentifier = "Cell";
            var cell = tableView.DequeueReusableCell (cellIdentifier);
            if (cell == null) {
                cell = new UITableViewCell (UITableViewCellStyle.Subtitle, cellIdentifier);
                //Add in a detail disclosure icon to each cell
                cell.Accessory = UITableViewCellAccessory.DetailDisclosureButton;
            }

            // Configure the cell.
            var sInfo = controller.listSecInfo [indexPath.Row];
            cell.TextLabel.Text = String.Format ("{0}",sInfo.SecCode);
            cell.DetailTextLabel.Text = sInfo.SecName;

            return cell;
        }


        private void InfoAlert (string msg)
        {
            using (UIAlertView av = new UIAlertView("Info", msg, null, "OK", null)) {
                av.Show ();
            }
        }

        public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
        {
            var sInfo = controller.listSecInfo [indexPath.Row];

            controller.DetailVC.DrawChart(sInfo.SecID, sInfo.SecCode);
        }



    }
    class IndicatorDataSource : UITableViewSource
    {
        static NSString cellIdentifier = new NSString ("CellId");
        RootViewController controller;

        public IndicatorDataSource (RootViewController controller)
        {
            this.controller = controller;
        }

        // Customize the number of sections in the table view.
        public override int NumberOfSections (UITableView tableView)
        {
            return 1;
        }

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

        public override string TitleForHeader (UITableView tableView, int section)
        {
            return "Indicators";
        }

        // Customize the appearance of table view cells.
        public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
        {
            string cellIdentifier = "Cell";
            var cell = tableView.DequeueReusableCell (cellIdentifier);
            if (cell == null) {
                cell = new UITableViewCell (UITableViewCellStyle.Subtitle, cellIdentifier);
                //Add in a detail disclosure icon to each cell
                cell.Accessory = UITableViewCellAccessory.DetailDisclosureButton;
            }

            // Configure the cell.
            var sInfo = controller.listIndicator [indexPath.Row];
            cell.TextLabel.Text = String.Format ("{0}",sInfo.DescriptiveName);
            cell.DetailTextLabel.Text = sInfo.ShortName;

            return cell;
        }



        private void InfoAlert (string msg)
        {
            using (UIAlertView av = new UIAlertView("Info", msg, null, "OK", null)) {
                av.Show ();
            }
        }

        public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
        {
            var sInfo = controller.listIndicator [indexPath.Row];

            //controller.DetailVC.DrawChart(sInfo.SecID, sInfo.SecCode);
        }


    }

}

ただし、2 番目のタブをクリックするとクラッシュします。以下のようなエラーが表示されます

「ネイティブ コードの実行中に SIGSEGV を取得しました」

最初のリストは正常に読み込まれました。

4

1 に答える 1

0

UITableViewController オブジェクトが収集され、中止が発生していると思います。secController と secController メンバー変数を作成します。

public partial class RootViewController : UITabBarController
{
    UITableViewController secController;
    UITableViewController IndiController;

    public DetailViewController DetailVC { get; set; }

...

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();
    //Read data from Database..
    secController = new UITableViewController ();
    IndiController = new UITableViewController ();
于 2012-05-13T21:35:27.727 に答える