在 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 中的远程通知的“默认用户操作”上推送视图控制器