Как загрузить контроллер при нажатии кнопки с помощью RubyMotion?

Допустим, у меня есть 2 контроллера A и B.

В А у меня есть:

def viewDidLoad
  super
  button = UIButton.buttonWithType UIButtonTypeRoundedRect
  button.setTitle "Open B", forState: UIControlStateNormal
  button.addTarget(self, action: :open_b, forControlEvents: UIControlEventTouchUpInside)
  self.view.addSubview button
end

def open_b
  # ?????
end

В Б у меня другая точка зрения со своей логикой, которая не важна.

Я хочу открыть B при нажатии кнопки. Как мне это сделать?

Это должно быть совершенно очевидно для любого, у кого есть опыт работы с iOS, но я не могу найти, как вы должны это делать. Любые указатели приветствуются. Решение в Objectve-C приемлемо и получит мой голос, даже если я бы предпочел, чтобы оно было с RubyMotion.


person marcgg    schedule 04.11.2012    source источник


Ответы (2)


Вот как это сделать с помощью контроллера модального представления:

app_delegate.rb:

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

viewa.rb:

class MyViewA < UIViewController

  def viewDidLoad
    super
    button = UIButton.buttonWithType UIButtonTypeRoundedRect
    button.setTitle "Open B", forState: UIControlStateNormal
    button.frame = [[10, 50], [300, 50]]
    button.addTarget(self, action: "open_b", forControlEvents: UIControlEventTouchUpInside)
    self.view.addSubview button
  end

  def open_b
    view_b = MyViewB.alloc.init
    view_b.delegate = self
    self.presentViewController view_b, animated:true, completion:nil
  end

  def done_with_b
    self.dismissViewControllerAnimated true, completion:nil
  end

end

видб.рб:

class MyViewB < UIViewController

  attr_accessor :delegate

  def viewDidLoad
    super
    button = UIButton.buttonWithType UIButtonTypeRoundedRect
    button.setTitle "Return to A", forState: UIControlStateNormal
    button.frame = [[10, 50], [300, 50]]
    button.addTarget(self, action: "press_button", forControlEvents: UIControlEventTouchUpInside)
    self.view.addSubview button
  end

  def press_button
    delegate.done_with_b
  end

end
person vacawama    schedule 04.11.2012
comment
Спасибо! Это работает нормально, и мне нравится анимация. Мне было интересно: мне удалось что-то запустить, перейдя UIApplication.sharedApplication.delegate.window.rootViewController = MY_CONTROLLER, это плохая идея? - person marcgg; 04.11.2012
comment
Моя внутренняя реакция на то, что я просто заменю контроллер корневого представления, заключается в том, что это неправильный способ сделать это, но я не могу сказать вам, как это может вызвать у вас проблемы. - person vacawama; 04.11.2012
comment
Да, у меня такое же чувство... но пока все работает нормально ^^ Что, если я не хочу использовать модальное окно и просто хочу полностью переключиться на другой контроллер? - person marcgg; 04.11.2012
comment
Я думаю, что все зависит от предполагаемого потока вашего приложения. Если вы никогда не планируете, чтобы пользователь возвращался к просмотру контроллера A, то можно заменить его на B. Если пользователь должен иметь возможность выбирать A или B по своему желанию, используйте TabBarController. Если они углубляются в иерархию, используйте NavigationController. Если они заполняют некоторую информацию, а затем возвращаются к вашему первому экрану, нажмите модально на контроллер представления. - person vacawama; 05.11.2012

Вот пример того, как это сделать: https://github.com/IconoclastLabs/rubymotion_cookbook/tree/master/ch_2/11_navbarbuttons

В частности, ваш метод будет использовать эту часть:

def performAdd
    @secondary_controller = SecondaryController.alloc.init
    self.navigationController.pushViewController(@secondary_controller, animated:'YES')
end

Я настоятельно рекомендую обращаться к этому репозиторию (да, это мое), когда вам нужны основы!

http://iconoclastlabs.github.com/rubymotion_cookbook/

Надеюсь, это сделает это для тебя!

person Gant Laborde    schedule 04.11.2012
comment
Значение для animated: должно быть true, а не 'YES'. 'YES' работает, но по той причине, что строка верна для логических значений, поскольку она не равна нулю. Но изменение его на 'NO' не дало бы желаемого эффекта, поскольку это все еще верно в логическом смысле. - person vacawama; 04.11.2012
comment
@vacawama да, ты прав. Это было написано давным-давно и должно быть обновлено. Пожалуйста, сделайте запрос на вытягивание! Мы с радостью примем ваш вклад в проект с открытым исходным кодом. - person Gant Laborde; 05.11.2012