UIElements становится неактивным, когда RootViewController установлен из SceneDelegate в iOS 13.1 - PullRequest
0 голосов
/ 23 октября 2019

В настоящее время я испытываю эти проблемы в обновлении Xamarin.iOS для iOS 13.1. Когда я устанавливаю LoginController вручную в качестве начального ViewController из Main.Storyboard, все работает нормально, но когда я устанавливаю LoginController как rootViewController в SceneDelegate.cs, все UIElements будут неактивны при загрузке моего приложения.

ЗДЕСЬ МОЙ КОД

    [Export("scene:willConnectToSession:options:")]
    public void WillConnect(UIScene scene, UISceneSession session, UISceneConnectionOptions connectionOptions)
    {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see UIApplicationDelegate `GetConfiguration` instead).

        //// Decide first screen
        UIWindowScene windowScene = new UIWindowScene(session, connectionOptions);

        var window = new UIWindow(windowScene);
        var storyboard = UIStoryboard.FromName("Main", null);

        var registerController = storyboard.InstantiateViewController("LoginViewController") as LoginViewController;
        this.SetWindow(window);


        window.RootViewController = registerController;
        window?.MakeKeyAndVisible();
        window.MakeKeyWindow();

    }

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Причина в том, что обычное окно не может быть присвоено this.Window. Изменить код следующим образом:

[Export("scene:willConnectToSession:options:")]
public void WillConnect(UIScene scene, UISceneSession session, UISceneConnectionOptions connectionOptions)
{
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see UIApplicationDelegate `GetConfiguration` instead).

    //// Decide first screen
    UIWindowScene windowScene = new UIWindowScene(session, connectionOptions);

    //var window = new UIWindow(windowScene);
    this.Window = new UIWindow(windowScene); 
    var storyboard = UIStoryboard.FromName("Main", null);

    var registerController = storyboard.InstantiateViewController("LoginViewController") as LoginViewController;
    //this.SetWindow(window);


    this.Window.RootViewController = registerController;
    this.Window?.MakeKeyAndVisible();
    this.Window.MakeKeyWindow();

}

Тогда он может работать.

================================ Обновление ==========================================

Если не работает, найти причину можно двумя способами:

Один из способов - убедиться, что следующий код registerController не равен нулю.

var registerController = storyboard.InstantiateViewController("LoginViewController") as LoginViewController;

Вам необходимо проверить, совпадают ли идентификатор StoryBoard в StoryBoard с LoginViewController . enter image description here

Другой способ , вы можете создать класс UIViewController, не входящий в StoryBoard, чтобы проверить его. enter image description here

 this.Window.RootViewController = new NewCreatedViewController();
1 голос
/ 24 октября 2019

добавление контроллера представления в качестве корневого контроллера для любого приложения сделает ваше приложение недоступным для навигации. контроллер представления предназначен для контроллера, управляющего представлением, если вы не разработали упомянутый контроллер представления для управления представлениями, подобными навигационному контроллеру, и, судя по всему, это не то, что вы делаете. контроллеры навигации управляют контроллерами представления. поэтому сделайте корень контроллером навигации с корнем этого контроллера навигации «LoginViewController» и посмотрите, что произойдет. Кроме того, прекратите использовать раскадровки, вы будете в ужасном мире, если / когда ваше приложение достигнет более 100 контроллеров представления. научитесь обращаться с этим программно, и вы скоро узнаете, как вся эта навигационная штука работает и взаимодействует с контроллерами и представлениями.

...