在xamarin.ios

时间:2017-09-11 12:53:03

标签: c# ios xamarin uitabbarcontroller viewcontroller

我正在使用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);

任何建议将不胜感激!

2 个答案:

答案 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;
        }
}