首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据传回pop上的uiviewcontroller控制器(NavigationController.PopViewController)

将数据传回pop上的uiviewcontroller控制器(NavigationController.PopViewController)
EN

Stack Overflow用户
提问于 2017-11-21 07:42:08
回答 3查看 817关注 0票数 0

我正在使用iOS (仅使用代码,不使用故事板)开发一个Xamarin.iOS应用程序,当我从导航控制器弹出时,我想知道向原始uiview控制器发送数据的最佳方法是什么。

在安卓系统中,我使用StartActivityForResult,然后重写OnResult,但是对于iOS,我找不到类似的方法。

我知道ViewDidLoad,ViewDidAppear等都有越权,我要找的是某种ViewDidGetPoppedBackTo (希望你能得到)。

或者还有其他更好的方法来实现这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-21 09:27:08

NavigationController将所有ViewControllers作为数组进行跟踪:NavigationController.ViewControllers

您可以通过以下代码从该数组中获取ViewController类型的现有实例:(如果有此方法,可以用BaseViewController编写该方法)。

代码语言:javascript
复制
public T InstanceFromNavigationStack<T> () where T : UIViewController
{
    return (T)NavigationController.ViewControllers.FirstOrDefault(v => v is T);
}

然后像这样使用它:

代码语言:javascript
复制
var myVCInstance = InstanceFromNavigationStack<MyTargetViewController>();
if(myVCInstance != null)
{
    //Assign a value like
    myVCInstance.MyVariable = "MyValue";

    //Or call a method like
    myVCInstance.MethodToReloadView("MyValue")
}
//Go Back Navigation Code
//Then here write your navigation logic to go back.

这不仅有助于在以前的ViewController中传递数据,而且有助于在堆栈中传递任何ViewController。只需传递它的类型就可以从Stack获得一个实例。

注意:如果导航堆栈没有相同ViewController类型的多个实例,那么应该可以工作。

票数 2
EN

Stack Overflow用户

发布于 2017-11-22 04:20:03

用这种方式

代码语言:javascript
复制
ViewController viewController = (ViewController)NavigationController.TopViewController;
viewController.SendData(myevent);

在您的SendData中创建方法ToViewController,当导航返回并将数据发送到以前的ViewController时,首先调用该方法。

票数 1
EN

Stack Overflow用户

发布于 2017-11-23 13:21:37

我已经开始使用的另一个选项是EventHandler方法。下面是一个示例,用于使用从UITextField (子视图控制器)中选择的内容填充父视图控制器中的UITableView,然后关闭子视图控制器。

在父视图控制器中定义EventHandler方法:

代码语言:javascript
复制
void LocationLookup_OnSelected(object sender, EventArgs e)
{
    chosenLocation = (MKPlacemark)sender;
    planLocation.Text = chosenLocation.Name;

    this.ParentViewController.DismissViewController(true, null);
}

将父类的EventHandler方法作为子属性传递。

代码语言:javascript
复制
public partial class LocationLookupViewController : UITableViewController
{
    private event EventHandler OnSelected;

    public LocationLookupViewController(EventHandler OnSelected)
    {
        this.OnSelected = OnSelected;
    }

    ...
}

调用传入父级中需要的对象/数据的EventHandler

代码语言:javascript
复制
public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
    ...

    OnSelected(response?.MapItems[0].Placemark, new EventArgs());   
}

注:上面的类和函数是不完整的,但是应该为您提供关于这种技术是如何工作的概念。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47407724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档