MonoTouch以编程方式为ContainerView实例化ViewController

时间:2013-02-01 15:13:22

标签: ios xamarin.ios

我正在尝试使用MonoTouch中的容器视图,我正在线上学习一些教程。他们讨论了从容器中以编程方式添加和删除视图控制器的问题。我在项目的故事板中创建了一个viewcontroller和视图,并附加了一些插座和一个动作(分别用于标签和按钮)。我创建了一个重载的构造

以下是我试图将viewControllers添加到容器视图中的视图控制器中的代码。

public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
        ContainerView.AutoresizingMask = UIViewAutoresizing.FlexibleHeight;
        _controllerOne = new IngredientsController("Perishables");
        _controllerTwo = new IngredientsController("Spices");
        AddChildViewController(_controllerOne);
        ContainerView.AddSubview(_controllerOne.View);
        _controllerOne.DidMoveToParentViewController(this)
    }

当我为_controllerOne添加子视图时,我收到错误,因为我的控制器上的元素被标记为null。如果控制器是在Interface Builder中制作的,MonoTouch是否无法以编程方式创建视图控制器?以下是成分控制器的两个构建器。当使用segue时,所有UI控件都会正确初始化。我是否需要以编程方式创建控制器,然后以这种方式实例化它?任何帮助将不胜感激。

//This ctor does not work
public IngredientsController (string title) : base(NSObjectFlag.Empty)
{
_ingredientTitle = title;
}

//This ctor works
public IngredientsController (IntPtr handle) : base (handle)
{
}

2 个答案:

答案 0 :(得分:0)

尝试交换AddSubView()DidMoveToParentViewController()方法,如下所示:

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();
    ContainerView.AutoresizingMask = UIViewAutoresizing.FlexibleHeight;
    _controllerOne = new IngredientsController("Perishables");
    _controllerTwo = new IngredientsController("Spices");
    this.AddChildViewController(_controllerOne);        // Root child controller.
    _controllerOne.DidMoveToParentViewController(this); // Confirm the rooting.
    ContainerView.AddSubview(_controllerOne.View);      // Access the view.
}

答案 1 :(得分:0)

尝试像这样实例化视图控制器:

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

        this.ContainerView.AutoresizingMask = UIViewAutoresizing.FlexibleHeight;

        var newController = this.Storyboard.InstantiateViewController("IngredientsController");

        this.AddChildViewController (newController);        
        this.ContainerView.AddSubview (mapController.View);
    }

确保在ViewController的属性面板中设置Storyboard ID