ContainerViewController

ContainerViewController

目前,我在教程中遵循了一些编码,以允许在一个容器视图内使用多个视图控制器,并在选择表中的一行时使用带有标识符的自定义脚本来呈现新的视图控制器。

我在xamarin.ios中编码

现在,我选择的行已工作,并且它在我的ContainerViewController中激活了正确的行。但是,当PerformPergue被激活时,它会引发错误,因为它说


  抛出Objective-C异常。名称:NSInvalidArgumentException原因:接收者()没有标识为“ test1”的标记


我有ID为test1的segue,因此ID是正确的,但仍然抛出该错误。

这是我遵循的教程:https://kodesnippets.wordpress.com/2015/08/11/container-view-in-ios/

这是ContainerViewController的代码:

namespace PMApp
{
    public partial class ContainerViewController : UIViewController
    {
        public ContainerViewController(IntPtr handle) : base(handle) { }
        public ContainerViewController() : base("ContainerViewController", null){}

        UIViewController vc;
        string segueIdentifier;
        UIViewController lastViewController;

        public void segueIdentifireRecievedFromParent(int selectedRow)
        {
            ContainerViewController containerController = new ContainerViewController();

            if (selectedRow == 0)
            {
                segueIdentifier = "test1";
                PerformSegue(segueIdentifier, null);

            }
            else if (selectedRow == 1)
            {
                segueIdentifier = "test2";
                PerformSegue(segueIdentifier, null);
            }
        }

        public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
        {
            base.PrepareForSegue(segue, sender);

            if (segue.Identifier == segueIdentifier)
            {
                if (lastViewController != null)
                {
                    lastViewController.View.RemoveFromSuperview();
                }

                vc = segue.DestinationViewController as UIViewController;
                AddChildViewController(vc);
                View.AddSubview(vc.View);
                vc.DidMoveToParentViewController(this);
                lastViewController = vc;
            }
        }
    }
}


这是处理我的表和行选择的类:

namespace PMApp.Classes
{
    public class TableSource : UITableViewSource
    {
        List<string> TableItems;
        string CellIdentifier = "AreaCell";

        public TableSource(List<string> items)
        {
            TableItems = items;
        }

        public override nint RowsInSection(UITableView tableview, nint section)
        {
            return TableItems.Count;
        }

        public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
        {
            UITableViewCell cell = tableView.DequeueReusableCell(CellIdentifier);
            string item = TableItems[indexPath.Row];

            //---- if there are no cells to reuse, create a new one
            if (cell == null)
            { cell = new UITableViewCell(UITableViewCellStyle.Default, CellIdentifier); }

            cell.TextLabel.Text = item;

            return cell;
        }

        public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
        {
            ContainerViewController containerController = new ContainerViewController();

            containerController.segueIdentifireRecievedFromParent(indexPath.Row);
            //MainViewController.PresentContainerView(indexPath.Row);
            tableView.DeselectRow(indexPath, true);
        }

        private void newAlertView()
        {
            var alertController = UIAlertController.Create("Title", "Message", UIAlertControllerStyle.Alert);
            alertController.AddAction(UIAlertAction.Create("back", UIAlertActionStyle.Default, null));

        }
    }
}


希望有人可以提供帮助,一直在解决方案中进行搜索,但无法解决任何问题。

最佳答案

就像@ Paulw11所说的那样,我们不应在ContainerViewController事件中创建RowSelected()的新实例。这个实例不是您在Storyborad中放置的,因此它无法知道您在Storyboard中所做的所有配置。

假设您将ContainerView放在TableView所在的ViewController中。我们可以通过Storyboard获取实例:

ContainerViewController containerViewController;
public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
{
    if (segue.Identifier == "Container")
    {
        containerViewController = segue.DestinationViewController as ContainerViewController;
    }
}


然后将此containerViewController传递给TableSource。最后,您可以在ContainerViewController事件中调用RowSelected()的方法:

public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
    container.segueIdentifireRecievedFromParent(indexPath.Row);
}


但是我想建议您使用另一种方式来“更改” containerViewController的容器。通过您的链接,作者只需使用segue将控制器及其视图添加到containerView。无需使用segue,我们可以直接添加它们:

首先,在情节提要中创建两个constrollers,并在控制器的属性选项卡中设置它们的情节提要ID。

然后我们可以在ContainerViewController中使用它们:

UIViewController lastViewController;
private void addSubsFrom(string viewControllersIdentifier)
{
    if (lastViewController != null)
    {
        lastViewController.View.RemoveFromSuperview();
        lastViewController.RemoveFromParentViewController();
    }

    var viewController = Storyboard.InstantiateViewController(viewControllersIdentifier);
    viewController.View.Frame = View.Bounds;

    View.AddSubview(viewController.View);
    AddChildViewController(viewController);

    lastViewController = viewController;
}

public void segueIdentifireRecievedFromParent(int selectedRow)
{
    if (selectedRow == 0)
    {
        addSubsFrom("TestAVC");

    }
    else if (selectedRow == 1)
    {
        addSubsFrom("TestBVC");
    }
}


Here是供您参考的我的示例。

关于c# - 一个容器 View 上有多个 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50594440/

10-09 09:51