自定义URL方案RubyMotion

时间:2012-06-13 03:12:40

标签: ios url uiviewcontroller url-scheme rubymotion

我需要在我的应用中转到指定的ViewController。我在Safari中输入scheme://时可以很好地访问rootViewController,因为我编辑了我的Info.plist。我甚至发现了这个:

https://stackoverflow.com/a/10925872/1327809

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
[self.viewController presentModalViewController:controller animated:YES];
[controller release];

return YES;        
}

这正是我想要解决的一个问题。我不得不使用RubyMotion(我是新手),因此甚至没有nib文件。

def application( application, handleOpenURL:url )
// desired code

end

感谢您提供任何可能的帮助,如果您需要更多信息,请与我们联系。

2012年6月14日更新
我发现handOpenURL方法已被弃用,所以现在我正在使用它的替代品。

我已经包含了我的代码,因为我不能为我的生活弄清楚为什么我会得到黑屏。我甚至从controller.rb中删除了if / else,只是让它运行初始视图控制器,无论是通过Safari还是直接点击应用程序,如果通过Safari,它仍然是黑色的。如果这应该是一个新问题,请告诉我,我将开始一个新问题。

didFinishLaunchingWithOptions和openURL都必须通过workFlowController方法,然后将我们发送到controller.rb并运行方法viewWillAppear。有一个URL确定哪个视图控制器运行。

我认为app_delegate.rb中的内容没有正确编码。我不知道新的openURL方法代码应该如何与我在下面评论的内容不同。当我运行rake设备时,有没有办法在我的控制台中查看我的日志(我使用日志并放入相关方法)?当我完全退出应用程序并尝试通过Safari返回时我还需要它才能登录,因为根据Apple Docs,“如果应用程序是由于另一个应用程序要求它打开URL资源而启动的,那么首先是UIApplication向应用程序发送一个应用程序:didFinishLaunchingWithOptions:message然后它调用此方法。“我想看看当应用程序没有运行时我的应用程序是否会发生这种情况,但是我是通过URL打开的。

非常感谢任何反馈。我再次感谢你在这一点上提供的帮助。我会继续看。

app_delegate.rb

class AppDelegate
...
  def application( application, didFinishLaunchingWithOptions: launchOptions )
  ...
     @window.rootViewController = self.workFlowController
  ...
  true
  end

  def application( application, openURL: url, sourceApplication: sourceApplication, annotation: annotation )

     if sourceApplication !=nil
       #should I now be using this instead of from_open_url? 
     end
     ...
     @window.rootViewController = self.WorkFlowController

     @window.rootViewController.from_open_url = true
     ...
     true
  end

  def workFlowController

     @_workFlowController ||= begin

     wfController = Auth::Controller.alloc.init

     wfController.delegate = self

     # return wf controller
     wfController

     end
  end
  ...
end

controller.rb

module Auth

  class Controller < BaseController
  ...
     attr_accessor :delegate, :from_open_url
  ...
     def viewWillAppear( animated )

        super

        # app loads from URL, password reset controller loads first
        if (@from_open_url)

           self.presentViewController( 
             self.urlController,
             animated: false 
           )       

        else 

           self.presentViewController( 
             self.otherController,
             animated: false
           )       

        end

     end
     ...
  end    
end

1 个答案:

答案 0 :(得分:2)

我不知道您确切的应用设置,但您应该只能使用MyViewController.alloc.init。这是一个完整的工作示例。这会加载默认图像(foo.png),但如果通过URL打开应用程序,则会显示带有不同图像的模态视图(bar.png)。

class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    @viewController = Foo.alloc.init
    @window.rootViewController = @viewController
    @window.rootViewController.wantsFullScreenLayout = true
    @window.makeKeyAndVisible
    true
  end

  def application(application, openURL:url, sourceApplication:sourceApp, annotation:annotation)
    # Here's where you might parse the url and decide which view controller to use
    controller = Bar.alloc.init
    @viewController.presentModalViewController(controller, animated:true)
    true
  end
end

class Foo < UIViewController
  def viewDidLoad
    self.view = UIImageView.alloc.initWithImage(UIImage.imageNamed('foo.png'))
  end
end

class Bar < UIViewController
  def viewDidLoad
    self.view = UIImageView.alloc.initWithImage(UIImage.imageNamed('bar.png'))
  end
end