在 xamarin.ios 中的视图控制器之间传递数据

Posted

技术标签:

【中文标题】在 xamarin.ios 中的视图控制器之间传递数据【英文标题】:Passing data between viewcontrollers in xamarin.ios 【发布时间】:2017-09-11 12:53:02 【问题描述】:

我正在 Xamarin.ios (C#) 中开发一个 iPhone 应用程序,但在 ViewControllers 之间传递变量时遇到了困难(我正在使用情节提要)。

下面列出了我的应用程序的总体布局:

LoginViewController --> TabViewController --> NavigationController --> MainViewController

添加了屏幕截图:

Overview of my Storboard - Explains what I want to do:

我想做的是当用户的凭据在“LoginViewController”成功验证时,应用程序会将用户带到“MainViewController”。

我还想将“LoginViewController”中的变量(比如说“用户名”)传递给“MainViewController”。但是,我没有运气。

我在下面发布了我的代码。它正在工作(传递变量),但问题是由于我们直接从 LoginView 推送到 MainView,Tabbar 和 Navigation Bar 不再显示。

如果存在 tabViewController,在 ViewController 之间传递数据的最佳做法是什么?

// Instantiating the MainViewController
MainViewController controller = this.Storyboard.InstantiateViewController("MainViewController") as MainViewController;

//Here I pass the data from the LoginViewController to the MainViewController
controller.userName= this.userName;

// Show the MainViewController
this.NavigationController.PushViewController(controller , true);

任何建议将不胜感激!

【问题讨论】:

理想情况下,您的 ViewController 应该尽可能地解耦。实现这一点的一种方法是使用事件/委托从视图控制器传回数据。看看这个page 的例子 【参考方案1】:

你可以在 NSUserDefaults 中保存一些数据。

var UserData = NSUserDefaults.StandardUserDefaults;
  UserData.SetString(this.UserName,"UserName");

您可以在应用中的任何位置使用它

var UserData = NSUserDefaults.StandardUserDefaults;
UserData.StringForKey("UserName");

您尝试传递数据的方式是正确的,但您无法直接从 LoginView 打开主视图。如需更多帮助,您应该尝试阅读一些有关使用 TabView 的文章。

https://developer.xamarin.com/guides/ios/user_interface/controls/creating_tabbed_applications/

【讨论】:

【参考方案2】:

子类化 ViewController,在它的数据构造函数中添加一些新参数,以便在显示数据时将数据传递给控制器​​。

公共类 MyViewController : UIViewController

    private MyData _myData;

    public MyViewController(MyData myData)
    
        _myData = myData;
    

然后使用它:

(假设我们已经在另一个具有 NavigationController 的视图控制器中):

var myViewController = new MyViewController(myData); this.NavigationController.PushViewController(myViewController, true);

或(作为“模态”)

var myViewController = new MyViewController(myData); this.PresentViewController(myViewController, true);

//绑定数据到tableView //在你的主VC中

public override void ViewDidLoad ()

    base.ViewDidLoad ();
    table = new UITableView(View.Bounds); // defaults to Plain style`
    string[] tableItems = new string[] "a","b","c","d";//your data to be bind ..You can pass list also
    table.Source = new TableSource(tableItems); //Or you can provide your table name. 
    Add (table);

//Create TableView Source to bind data which is coming from VC
public class TableSource : UITableViewSource 

        string[] TableItems;
        string CellIdentifier = "TableCell";

        public TableSource (string[] items)
        
            TableItems = items;
        

        public override nint RowsInSection (UITableView tableview, nint section)
        
            return TableItems.Length;
        

        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;
        

【讨论】:

感谢您的回复。我试过这段代码。是的,它传递数据并查看新控制器,但 TabView 不再显示。有什么解决方法吗?我还添加了我的故事板的屏幕截图。你能看一下吗? 是否需要将用户数据(仅单个数据或列表)添加到tableVIew? 只是一个简单的字符串。 @Omer 我已经更新了代码,现在您可以检查,在您的主 VC 中获取数据后将其传递给 UITableViewSource,如图所示。如果有任何查询请告诉我。

以上是关于在 xamarin.ios 中的视图控制器之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Xamarin iOS 中的远程通知的“默认用户操作”上推送视图控制器

Xamarin iOS:滚动视图中的自动布局?

Xamarin iOS RowSelected 事件导航到 ViewController

设置拆分视图控制器 Xamarin.iOS

Xamarin iOS - 在列表视图行选择打开视图控制器

无法在Portrait,xamarin IOS中锁定一个视图控制器