2014-02-16 5 views
0

기본 탐색 컨트롤러를 사용하는 대신 내 탐색 컨트롤러의 역할을하는 사용자 지정 UIViewController 클래스를 구현하려고합니다. 다음은 내 컨테이너 클래스 나는이된다Mvvmcross - Container UIViewController

enter code here 공공 부분 클래스 ContainerView : MvxViewController { 정적 부울 UserInterfaceIdiomIsPhone { 의 get {UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone를 반환; }}

private UIViewController _currentView; 

    protected ContainerViewModel ContainerModel 
    { get { return base.ViewModel as ContainerViewModel; } } 

    public ContainerView() 
     : base (UserInterfaceIdiomIsPhone ? "ContainerView_iPhone" : "ContainerView_iPad", null) 
    { 

    } 



    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     var loginView = this.CreateViewControllerFor(ContainerModel.Login) as UIViewController; 
     ShowViewController(loginView); 
     // Perform any additional setup after loading the view, typically from a nib. 
    } 

    public ContainerView(UIViewController controller) 
     : base(UserInterfaceIdiomIsPhone ? "ContainerView_iPhone" : "ContainerView_iPad", null) 
    { 
     ShowViewController(controller); 
    } 

    public void ShowViewController(UIViewController viewController) 
    { 
     if (_currentView !=null) 
     { 
      RemoveCurrentViewController(); 
     } 

     AddChildViewController(viewController); 
     viewController.View.Frame = GetViewFrame(); 
     containerView.AddSubview(viewController.View); 
     _currentView = viewController; 
     viewController.DidMoveToParentViewController(this); 

    } 

    public void RemoveCurrentViewController() 
    { 
     _currentView.WillMoveToParentViewController(null); 
     _currentView.View.RemoveFromSuperview(); 
     _currentView.RemoveFromParentViewController(); 

    } 

    public RectangleF GetViewFrame() 
    { 
     return containerView.Bounds; 
    } 
} 

로그인 뷰가 뾰족 출구 인 containerView에로드 될 때 제 내 부하가 미세하다. 문제는 내 콘센트가 null 인 후속 요청입니다. 나는이 잘못된 일을 할 수 있지만 다음에 따라 발표자 표시 방법에서의 ViewController를 설정하려고 시도하고 다음 "viewDidLoad에"내 콘센트가 null가 터지지 않 같은 쇼에서 다른 문에 대한

public class MyPresenter: MvxTouchViewPresenter 
    { 
     private static ContainerView _cv; 

     public BlackhawkPresenter(MvxApplicationDelegate appDelegate, UIWindow window) 
      : base(appDelegate, window) 
     { 
      _cv = new ContainerView(); 
      window.RootViewController = _cv; 
     } 

     protected override UINavigationController CreateNavigationController(UIViewController viewController) 
     { 
      return new BlackhawkNavigationController(viewController); 
     } 

     public override void Show(Cirrious.MvvmCross.ViewModels.MvxViewModelRequest request) 
     { 
      var viewController = (UIViewController)Mvx.Resolve<IMvxTouchViewCreator>().CreateView(request); 
      if(request.ViewModelType == typeof(ContainerViewModel)) 
       base.Show(request); 
      else 
       _cv.ShowViewController(viewController); 

     } 

    } 

. ShowViewModel에 대한 호출을 인터셉트하여 컨테이너 뷰의 컨테이너 클래스에 표시하는 것이 확실하지 않습니다.

+0

뭐하는거야? 당신은 당신의 대답을 제거해서는 안됩니다. 그것은 매우 나쁜 스타일입니다. 다른 사람이 비슷한 문제가 있다면? 그것은 당신의 질문에 대답하려고하는 사람들에게 매우 무례합니다! – j7nn7k

답변

0

귀하의 코드는 혼란 조금 (약간 불완전)하지만 내 추측

  • 하나 만들어 하나 이상의 ContainerView 작성해야한다는 것입니다시 :

    _cv = new ContainerView(); 
    
  • 두 번째 만든 기간 :

     base.Show(request); 
    

이러한 경우 실제로 이들 중 하나만 RootViewController로 표시되고 _cv은 사용되지 않는보기 컨트롤러에 매달려 참조로 남아있을 수 있습니다.

해결책을 찾으려면 MvxTouchViewPresenter을보십시오.이 클래스를 완전히 바꾸거나 (기능을 원하지 않는 경우) 또는 가로 채기/무시할 가상 메소드 중 하나를 찾을 수 있습니다 당신이 필요로하는 변수를 포착하는 것 - 소스 코드는 https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Touch/Views/Presenters/MvxTouchViewPresenter.cs

예 : 아마도 이것과 같은 것이 작동 할 것입니다 :

protected override void ShowFirstView(UIViewController viewController) 
    { 
     _cv = (ContainerView)viewController; 
     base.ShowFirstView(viewController); 
    } 

...하지만 다른 많은 솔루션을 사용할 수 있습니다.