2015-12-20 3 views
1

Я уверен, что это, вероятно, очень простое решение, но я совершенно новичок в xamarin и C# в целом. Я создал табличное представление, и когда ячейка в этом представлении нажата, я хочу, чтобы она переходила к новому представлению с именем SecondViewController(). У меня есть следующий класс в моем ViewController.csНавигация Xamarin IOS с TableView

 public void changeview() 
    { 

      SecondViewController controller = this.Storyboard.InstantiateViewController("SecondViewController") as SecondViewController; 
     this.NavigationController.PushViewController(controller, true); 
    } 

Тогда в моем классе TableSource.cs, я следующий код для вызова changeview()

public override void RowSelected(UITableView tableView, NSIndexPath indexPath) 
    { 

     ViewController view = new ViewController(); 
     view.changeview(); 
     tableView.DeselectRow(indexPath, true); 
    } 

Я не получаю ошибок при компиляции, но когда он бежит, я получаю сообщение об ошибке на следующий код

SecondViewController controller = this.Storyboard.InstantiateViewController("SecondViewController") as SecondViewController; 

который читает

System.NullReferenceException: Object reference not set to an instance of an object 

Почему это не работает? если я использую этот же код в классе кнопок, он отлично работает, чтобы проверить, правильно ли я вызывал класс. Я изменил код в changeview() на UIAlertView и когда была нажата ячейка, действие alertview работало. Я не уверен, куда идти отсюда, возможно, есть лучший метод для изменения взглядов для этой цели? любая помощь очень ценится!

ответ

0

Для того, чтобы сделать нажатие, вам понадобится глобальная ссылка или доступ к текущему активному контроллеру навигации вашего приложения.

Что вы можете сделать, это создать экземпляр AppDelegate и установить контроллер навигации в переменную.

В вашем AppDelegate.cs

[Register ("AppDelegate")] 
public partial class AppDelegate : UIApplicationDelegate 
{ 
    //application layer declarations 
    public UINavigationController navCtrl { get; set; } 
    /* 
    . 
    . the rest of the codes 
    . 
    .*/ 
} 

В вашем ViewController.cs (первый вид) или контроллер представления корня, где вы инстанцированный навигационный контроллер:

public override void ViewDidLoad() { 
    AppDelegate appD = UIApplication.SharedApplication.Delegate as AppDelegate; 

    // assign the UINavigationController to the variable being used to push 
    // assuming that you have already initialised or instantiated a UINavigationController 
    appD.navCtrl = this.NavigationController; // Your UINavigation controller should be here 
    /* 
    . 
    . the rest of the codes 
    . 
    */ 
} 

В вашем TableSource.cs классе ,

private AppDelegate appD = UIApplication.SharedApplication.Delegate as AppDelegate; 

public override void RowSelected (UITableView tableView, NSIndexPath indexPath){ 
    SecondViewController secondView = UIStoryboard.FromName ("Main", null).InstantiateViewController ("SecondViewController") as SecondViewController; 
    appD.navCtrl.PushViewController (secondView, true); 
} 

Это должно быть в состоянии сделать то, что вы хотите.

+0

Я просто пробовал этот код, и теперь он дает мне «Произошло необработанное исключение». и я понятия не имею, почему. в вашем someFunction() должен ли быть больше кода после этих двух строк, или это все, что должно быть внутри функции? Должно ли что-нибудь быть вызвано этой функцией? большое спасибо за ответ! – JSheller

+0

Можете ли вы обновить образец кода в вопросе и включить свой первый контроллер просмотра, в котором вы использовали свой навигационный контроллер? Фактически, вы инициализировали объект UINavigationController где-нибудь? В моем примере someFunction() должен быть вашей собственной функцией, например 'viewDidLoad()'. Я обновил свой пример, чтобы устранить путаницы. – vincent

0

Вы должны сохранить ссылку вашего ViewController в классе TableSource.cs, как

public ViewController ParentController{ get; set;} 

При инициализации источника данных,

tableClassObject.ParentController = this; 

В строке Selected, он должен быть

public override void RowSelected(UITableView tableView, NSIndexPath indexPath) 
    { 
     tableView.DeselectRow(indexPath, true); 
     ParentController.changeview(); 
    } 

Это простейшее решение.

0
 SecondViewController controller = this.Storyboard.InstantiateViewController("SecondViewController") as SecondViewController; 

Вы использовали идентификатор раскадровки для «SecondViewController». Если не goto stroyboard добавить раскадровку Id к вашему SecondViewController

Смежные вопросы