2017-01-17 2 views
1

Давайте предположим, что у меня есть вид иерархии, как показано ниже:Форвард Действие UIButton в IBDesignable к Материнской контроллер

-- > UIViewController (myViewController) 
---- > UIView (IBDesignable - myCustomView) 
------- > UIButton (myButton) 

Есть ли возможный способ сказать myViewController, что myButton было вызвано взаимодействия с пользователем, например .touchUpInside , "БЕЗ" Делегат-шаблон с использованием либо Swift, либо Objective C?

Обратите внимание, что myCustomView является IBDesignable.

ответ

2

Объявление переменной UIButton на вашем viewController, например, с помощью IBOutlet.

@IBOutlet weak var button: UIButton! 

Чем больше у вас может быть цель - шаблон действия. Просто добавьте это в свой viewController.

button.addTarget(self, action: #selector(handleButtonTouch(_:)), for: .touchUpInside) 

и объявить функцию на ViewController

func handleButtonTouch(_ button: UIButton) { 
     print("button has been pressed") 
} 

EDIT

Вы также можете объявить IBAction функцию прямо из интерфейса Builder.

Нажмите на свой экземпляр UIButton, удерживая клавишу CTRL на клавиатуре и перетащите ее в подкласс UIViewController.

Устанавливаемые свойства:

Connection: Action 
Name: function name, something like `handleButtonTouch` 
Type: UIButton 
Event: the event you would like the function to be fired, in your case it is `Touch Up Inside` 

enter image description here

+0

@erdhee Вы должны пойти с этим решением вместо моего. Еще раз повторите свои вопросы, поняв, что кнопка уже находится в диспетчере представлений, просто подключите ее –

+0

@ViktorGardart с использованием шаблона уведомления также является хорошим решением;) – dirtydanee

+0

Я бы не использовал его в этом случае, хотя :) –

3

Вы можете использовать оповещения.

Добавьте этот код, где кнопка нажата

NotificationCenter.default.post(name: Notification.Name(rawValue: "ButtonTapped"), object: nil) 

И этот в myViewController:

NotificationCenter.default.addObserver(self, selector: #selector(methodToBeCalled), name: NSNotification.Name(rawValue: "ButtonTapped"), object: nil) 

Изменить «ButtonTapped» на то, что соответствует вашим потребностям лучше всего, а также methodToBeCalled это имя метода, который должен быть выполнен.

+1

я бы рекомендовал также ООН наблюдать уведомление в '' UIViewController' sublclasses deinit' функции. – dirtydanee

+0

Я не думаю, что шаблон уведомления работает отлично для этого случая. Я думаю, что это слишком много. – erdhee

0

Вы можете создать свой myButton как общественная собственность на вашем myCustomView и из кода в вашем myViewController вы можете вызывать этот метод

[myCustomView.myButton addTarget:self action:@selector(myButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 

Не забудьте реализовать myButtonPressed метод так же, как:

- (void)myButtonPressed:(UIButton*)aButton 
{ 
    //Do something.... 
} 
Смежные вопросы