我正在使用Xamarin.iOS(C#)开发一个iPhone应用程序,并且我坚持在ViewControllers之间传递变量(我正在使用故事板)。
我的应用的常规布局如下:
LoginViewController --> TabViewController --> NavigationController --> MainViewController
Overview of my Storboard - Explains what I want to do:
我想要做的是当用户的凭据在“ LoginViewController ”成功验证时,该应用会将用户带到“ MainViewController ”。
我还想将一个变量(比如'userName')从“ LoginViewController ”传递给“ MainViewController ”。但是,我没有运气。
我在下面发布了我的代码。它正在工作(传递变量),但问题是,由于我们直接从 LoginView 推送到 MainView ,因此Tabbar和导航栏不再显示。
如果 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);
任何建议将不胜感激!
答案 0 :(得分: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/
答案 1 :(得分:0)
对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;
}
}