2016-01-06 3 views
2

У меня есть два класса ViewController.Инициализация данных после получения от другого ViewController

Первый - HarachieRolliController. Второй - DetailTovarProsmotr

Я создал его в MainStoryboard файл в Xamarin прошивкой (C#)

Вот скриншот enter image description here

После нажатия на button_arrow_product002:

1) Необходимо открыть DetailTovarProsmotr 2) Он должен передавать данные в DetailTovarProsmotr и отображать его в некоторых полях, например (titleproduct001), это строка.

Первый код класса:

partial class HarachieRolliController : UIViewController 
{ 

    public HarachieRolliController (IntPtr handle) : base (handle) 
    { 
    } 
    public async override void ViewDidLoad() 
    { 

     base.ViewDidLoad(); 
     // Perform any additional setup after loading the view, typically from a nib. 

     string url2 = "http://papajohn.pp.ua/?mkapi=getProductsByCat&cat_id=83"; 
     JsonValue json = await FetchAsync(url2); 

    ParseAndDisplay (json); 
    } 

    private async void ParseAndDisplay(JsonValue json) 
    { 

     String title = json[1]["post_title"].ToString(); 
     button_arrow_product002.TouchUpInside += delegate { 

      Console.Out.WriteLine ("Clicked Button (button_arrow_product002)"); 
      DetailTovarProsmotr myvarible = new DetailTovarProsmotr (title); 

     }; 
    } 
} 
} 

Второй код класс:

public partial class DetailTovarProsmotr : UIViewController 
{ 
    public string mytitle; 

    public DetailTovarProsmotr (IntPtr handle) : base (handle) 
    { 

    } 
    public DetailTovarProsmotr(String title){ 
     this.mytitle = title; 
     Console.Out.WriteLine ("Constructor DetailTovarProsmotr is run"); 
     Console.Out.WriteLine (mytitle+" Console.Out.WriteLine (mytitle)"); 
     HendlerButtonClicked (mytitle); 

    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
     Console.Out.WriteLine (mytitle+" ViewDidLoad metod is run"); 

    } 

    public void HendlerButtonClicked(String title){ 
     Console.Out.WriteLine (title+" HendlerButtonClicked metod is run"); 
     titleproduct001.Text = title; 

    } 
} 

В классах и методах я консоль отображающей, чтобы увидеть этапы работы в моем приложении. Журнал консоли:

  1. ViewDidLoad Metod запускается

  2. Нажал кнопку (button_arrow_product002)

  3. Конструктор DetailTovarProsmotr запускается

  4. "Горячий ролл с лососем и угрем" Console.Out. WriteLine (mytitle)

  5. "Горяч й ролл с лососем и угрем "HendlerButtonClicked Metod запускается

Я думаю, что данные передаются позже, что ViewController начинают работать. И из-за этого titleproduct001.Text = title; не работает. У меня есть предупреждение. enter image description here Gow Я могу это исправить?

+0

Вы не можете использовать 'new DetailTovarProsmotr (...)', потому что этот UIViewController определен в StoryBoard. Когда вы его обновляете и пытаетесь использовать, класс не инициализируется правильно. Вам нужно использовать segue. Вы можете использовать метод PerformSegue UIViewController, чтобы вместо этого отобразить DetailTovarProsmotr. – dylansturg

ответ

1

Я подумал, что я мог бы также опубликовать это как ответ с кодом для справки.

Проблема в том, что вы не используете раскадровку правильно. Переходы между экземплярами UIViewController должны выполняться через segues.

Теперь вам может быть интересно ... Как передать строку DetailTovarPostr в строку заголовка? При использовании Storyboard вы не можете использовать параметры конструктора для передачи данных, но вы можете использовать segues!

UIViewController имеет метод PrepareForSegue, который будет делать именно то, что вы хотите.

partial class HarachieRolliController : UIViewController 
    { 

    public HarachieRolliController (IntPtr handle) : base (handle) 
    { 
    } 
    public async override void ViewDidLoad() 
    { 

     base.ViewDidLoad(); 
     // Perform any additional setup after loading the view, typically from a nib. 

     string url2 = "http://papajohn.pp.ua/?mkapi=getProductsByCat&cat_id=83"; 
     JsonValue json = await FetchAsync(url2); 

     ParseAndDisplay (json); 
    } 

    private async void ParseAndDisplay(JsonValue json) 
    { 

     String title = json[1]["post_title"].ToString(); 
     button_arrow_product002.TouchUpInside += delegate { 

      Console.Out.WriteLine ("Clicked Button (button_arrow_product002)"); 
      // Use a segue to display the DetailTovarProsmotr 
      this.PerformSegue('YOUR SEGUE ID', this); 
      // The segue needs to be defined in the storyboard with a unique id 

     }; 
    } 

    protected override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender) { 
     var detailTovarPostr = segue.DestinationViewController as DetailTovarPostr; 
     // Initialized your custom view controller however you like 
     // Consider defining properties or an initialize method and pass in the title and other data 
     // TODO pass data :) 
    } 
} 

После того, как вы используете SEGUE, то IOS будет экземпляр UIViewController (назвать новый) и инициализировать его со всеми его видами (как titleproduct001). Это представление NULL, потому что UIViewController не был правильно инициализирован.

Вы говорите, что у вас уже есть segue, определенный между контроллерами вида. Если вам нужна помощь в получении/настройке идентификатора, дайте мне знать, и я тоже опубликую это.

+0

Я пробую ваш ответ, но когда я нажимаю кнопку, мое приложение закрывается. –

+0

Какая ошибка вы получаете? Вы изменили «YOUR SEGUE ID» на правильную строку? Вы заполнили PrepareForSegue? – dylansturg

+0

this.PerformSegue ("title", this); –