2012-03-25 8 views
9

Próbuję nauczyć się monotouch w tej chwili i postępować zgodnie z naukową książką monotouch Mike'a BlueSteina. Nie jest to zła książka, ale jest nieco przestarzała od czasów Xcode 4 (wierzę) i pojawiła się nowsza wersja na Monotouch.Jak dodać niestandardowy widok do widoku zdefiniowanego w pliku XIB w monotucie

W każdym razie, w moim projekcie mam kontroler i plik xib. Mam również niestandardowy widok (np. Myview: UIView), który zastępuje metodę rysowania. Chcę pokazać mój niestandardowy widok obok lub nad widokiem zdefiniowanym w pliku Xib. Jak mam to zrobic?

W kontrolerze, jeśli przesłonię metodę LoadView i ustawię widok na instancję mojego widoku niestandardowego, to widzę, ale tracę wszystko, co zdefiniowano w pliku Xib. Jeśli spróbuję dodać jako widok podrzędny, nie pojawia się wcale.

Czego mi brakuje? Jeśli pytanie nie jest jasne, proszę zapytaj mnie, abym mógł wyjaśnić.

Pozdrawiam.

+0

Ten [SO pytanie] (http://stackoverflow.com/questions/863321/iphone -how-to-load-a-view-using-a-nib-file-created-with-interface-builder) może pomóc – tipycalFlow

Odpowiedz

22

Wykonaj następujące kroki, aby użyć niestandardowego widoku w XIB:

pierwsze, udekorować widok z RegisterAttribute:

[Register("MyView")] 
public class MyView : UIView 
{ 
} 

i wdrożyć następujące konstruktora:

public MyView(IntPtr handle) : base(handle) {} 

Ten konstruktor jest potrzebny, gdy środowisko wykonawcze spróbuje odtworzyć widok po zniszczeniu przez ostrzeżenie o pamięci. Po utworzeniu niestandardowej klasy:

  • Otwórz XIB w Xcode (zawsze przez dwukrotne kliknięcie na niego przez MonoDevelop) i dodać UIView gdzie chcesz.
  • W Xcode, ustawić, że klasa UIView do MyView (lub cokolwiek nazwa przekazana do RegisterAttribute):

Custom class for custom view

  • kompilacji Run.

EDIT:

Nie zastępują LoadView dla kontrolerów, które są ładowane z XIB. LoadView służy do tworzenia widoku kontrolera, gdy widok kontrolera nie jest załadowany z XIB.

+0

Pozdrawiam. Doskonała odpowiedź. –

3

Dzięki Dimitris, świetna odpowiedź.

Dla tych, którzy się mylić jak ja, tutaj jest procedura simplist dodać i użyć pliku XIB jako częściowe/podrzędny:

  1. dodać nowy plik XIB w MonoDevelop (tj LoginView.xib)
  2. Dodaj nową (częściową) klasę, będzie to klasa niestandardowa (jak powiedzmy, plik typu "Kod") dla widoku.Nadać mu dowolną nazwę "LoginView.cs")
  3. dodać atrybut (RegisterAttribte) i Constrctor jak exaplain powyżej Dimitris.
    1. Kliknij dwukrotnie na LoginView.xib, aby otworzyć go w XCode IB. Następnie zmień Custom Class Atrybut pliku XIb punkt do „pliku code-behind” (tj LoginView.cs)
  4. Dodaj żadnych wyjść lub działania, jeśli trzeba. MonoDevelop wygeneruje plik .designer i dołączy go do pliku z kodem, w którym widać wszystkie punkty sprzedaży i działania.
  5. W kontrolerach gdzie chcesz dodać ten pogląd, załaduj plik .xib następująco:

    widoki zmienna = NSBundle.MainBundle.LoadNib ("LoginView", to, null); LoginView loginView = Runtime.GetNSObject (views.ValueAt (0)) jako LoginView; mainLayout.AddSubview (loginView); // gdzie mainLoyout to symbol zastępczy w moim głównym ViewController

Te trzy linie są na podstawie odpowiedzi flexaddicted here